Использование команды AWK

Вы хотите включить $ PATH

, если вы используете bash, вы обычно хотите установить что-то вроде строки ниже в вашем файле .bashrc:

PATH=$PATH:/path/to/new/directory/

т.е. $PATH - ваш токнет PATH

и /path/to/new/directory - это путь, в котором хранятся новые двоичные файлы.

в моем случае, как правило, у меня есть некоторые скрипты в моем $ HOME / bin поэтому я бы сделал: PATH=$PATH:$HOME/bin

, затем обязательно отправьте файл, чтобы применить изменения к вашей текущей оболочке.

т.е. source ~/.bashrc или . ~/.bashrc

1
задан 3 September 2013 в 15:26

3 ответа

Разделители сценария Awk не передаются + комментарии

Этот вариант не передает разделители [begin ...] и [end ...].

#!/usr/bin/awk -f

BEGIN   {
    insect=0    # we are out of a section
    }

/^\[begin [a-z0-9_]+\]/ {
    insect=1    # section opening
    next
    }

insect == 1 {
    if($0 ~ /^header=7075\|/)   {
        insect=2    # we are inside the right section
        }
    else    {
        insect=0    # we are in a different section
        next
        }
    }

/^\[end [a-z0-9_]+\]/ && (insect == 2 || insect == 1)   {
    exit 0      # end of the right section -> stop processing
    }

insect == 2 {
    print       # we are inside the right section -> pass all lines
    }

Awk - разделители разделов разделили + контрактный код

#!/usr/bin/awk -f
BEGIN {ins=0}
/^\[begin [a-z0-9_]+\]/ {beg=$0; getline; if($0 ~ /^header=7075\|/) {print beg; ins=1}}
/^\[end [a-z0-9_]+\]/ && ins {print; exit 0}
ins

как однострочный :) Я не понимаю спрос на однострочные, но вот он:

awk 'BEGIN {ins=0} /^\[begin [a-z0-9_]+\]/ {beg=$0; getline; if($0 ~ /^header=7075\|/) {print beg; ins=1}} /^\[end [a-z0-9_]+\]/ && ins {print; exit 0} ins'

Преимущество программ в этом ответе состоит в том, что они обрабатывают ввод строки за строкой, как это обычно бывает в утилитах Unix. Это позволяет программе обрабатывать разделы журнала без экстремальных требований к памяти и позволяет программе работать параллельно (на многоядерных процессорах) с другими программами в трубе.

3
ответ дан 24 May 2018 в 18:23
  • 1
    Это не печатает строки begin и end, это предназначено? – moon.musick 3 September 2013 в 20:48
  • 2
    @ moon.musick: Да, это намеренно. Я понял вопрос, что нужно передать только содержание раздела. Этот код обрабатывает входные строки за строкой и способен обрабатывать чрезвычайно длинные разделы без высоких требований к памяти. Он также удобен для трубопроводов - обеспечивает параллельную обработку с другими компонентами в трубе благодаря поточной передаче. :) – pabouk 3 September 2013 в 21:52
  • 3
    Я вижу;) Я должен лучше узнать awk, я знаю, что он может обрабатывать очень сложные задачи обработки текста. – moon.musick 3 September 2013 в 22:37

Сценарий Bash

#!/bin/bash

section=""
insect=0
while read line
    do if [ "$insect" -eq "1" ] || [ "x$(echo -e $line | grep '\[begin')" != "x" ]; then
        insect=1
        section="${section}${line}\n"
    else
        continue
    fi
    if [ "x$(echo -e $line | grep '\[end')" != "x" ]; then
        if [ "x$(echo -e $section | grep 'header=7075')" != "x" ]; then
            echo -e "$section"
        fi
        section=""
        insect=0
    fi
done < OutpdirImpressions.log

Скрипт Python

(лучшая производительность, чем bash)

#!/usr/bin/env python

section = ''
insect = False
with open('OutpdirImpressions.log', 'r') as f:
    while True:
        line = f.readline()
        if line == '':
            break
        if insect or line.startswith('[begin'):
            insect = True
            section += line
        else:
            continue
        if line.startswith('[end'):
            if 'header=7075' in section:
                print(section)
            section = ''
            insect = False
2
ответ дан 24 May 2018 в 18:23
  • 1
    Обе ваши программы передают текст перед разделителем раздела [begin ...]. – pabouk 3 September 2013 в 23:05
  • 2
    Ты прав. Я думал, что это не будет проблемой, потому что vipin8169 не избегал этого ни в его примерах. Я исправил это, но в любом случае ваш скрипт awk более изящный. – Germar 3 September 2013 в 23:44

Я не уверен, что это вообще отвечает на ваш вопрос, т. е. интересуетесь ли вы «чем бы ни работает» или, скорее, в awk -специфическом ответе, но мне казалось, что вам нужен онлайнер (не то, чтобы эти примеры очень полезны):

python3 -c "import re; print(*[rec for rec in re.findall('(?ms)\[begin.*?(?=\[begin|\Z)', open('OutpdirImpressions.log.2013-09-02').read()) if 'header=7075' in rec])"

и для Python 2.6 или 2.7 (без «звездной» распаковки для всего, что я помню):

python -c "import re; print([rec for rec in re.findall('(?ms)\[begin.*?(?=\[begin|\Z)', open('OutpdirImpressions.log.2013-09-02').read()) if 'header=7075' in rec][0])"
1
ответ дан 24 May 2018 в 18:23
  • 1
    Поскольку я знаю очень мало о python, и этот код для меня непонятен, я тестировал его. К сожалению, я обнаружил некоторые проблемы: код python3 передает текст после разделителя [end ...]. Код python 2.x показывает синтаксическую ошибку в python 2.7.3 на * после print(. – pabouk 3 September 2013 в 22:55
  • 2
    @pabouk исправил опечатку, там определенно не должно быть *. Возможно, мы работаем над разными образцовыми файлами - я несколько раз копировал «раздел», предоставленный OP, в файл несколько раз, изменяя часть header=xxxx - команда печатает только правильную «секцию», поэтому я предположил, что она работает достаточно хорошо , Код немного запутан, так как я хотел сделать oneliner - в основном он делит файл на разделы с помощью regex с lookahead, а затем делает список разделов, но отфильтровывает «неправильные» разделы. Python не позволяет вам сжимать много логики в одну строку (и делает это специально). – moon.musick 3 September 2013 в 23:40
  • 3
    Пример файла из вопроса не является хорошим представлением того, что описано в вопросе. Он не содержит текст до и после единственного раздела. Я скопировал и вложил несколько строк до и после раздела, чтобы проверить исходные и конечные условия в моем сценарии. – pabouk 4 September 2013 в 15:16
  • 4
    @pabouk. Просмотр в регулярном выражении, который я использовал, ожидает в конце раздела другой [begin или конец файла (\Z). Если бы у меня было больше данных о тексте до и после раздела, я мог бы добавить его в альтернативу в lookahead. – moon.musick 4 September 2013 в 15:25

Другие вопросы по тегам:

Похожие вопросы: