Переменная оболочки передачи как/pattern/к awk

Проверьте свои журналы на что-либо интересное, например. /var/log/messages или /var/log/mail.log.

Вы могли также открыть отдельную сессию SSH или консоль и присоединить strace к процессу дурака, после того как Вы запустили его. Найдите pid с ps aux | grep mutt на Вашей другой сессии/консоли, и делают

strace -p pid

Необходимо смочь понять то, что дурак зависает/разрушает на, или по крайней мере новый след для следования для поиска и устранения неисправностей. Можно также хотеть, добавляют -f переключитесь на strace для следования за дочерними процессами, если он разветвляется. Сообщите мне то, что Вы находите...

61
22.03.2014, 01:04
5 ответов

Используйте оператор awk ~ , и вам не нужно предоставлять буквальное регулярное выражение с правой стороны:

function _process () {
    awk -v l="$line" -v pattern="$1" '
        $0 ~ pattern {p=1} 
        END {if(p) print l >> "outfile.txt"}
    '  
}

Хотя это было бы более эффективно (не нужно читать полностью файл)

function _process () {
    grep -q "$1" && echo "$line"
}

В зависимости от шаблона может потребоваться grep -Eq "$ 1"

53
29.04.2021, 00:41
awk  -v pattern="$1" '$0 ~ pattern'

Имеется проблема в том, что awk расширяет escape-последовательности ANSI C (например, \ n для новой строки, \ f для подачи формы, \\ для обратной косой черты и т. Д.) В $ 1 . Поэтому возникает проблема, если $ 1 содержит символы обратной косой черты, которые распространены в регулярных выражениях (с GNU awk 4.2 или выше, значения, начинающиеся с @ / и заканчиваются на / , также являются проблемой ). Другой подход, который не страдает от этой проблемы, - написать его:

PATTERN=$1 awk '$0 ~ ENVIRON["PATTERN"]'

Насколько это будет плохо, будет зависеть от реализации awk .

$ nawk -v 'a=\.' 'BEGIN {print a}'
.
$ mawk -v 'a=\.' 'BEGIN {print a}'
\.
$ gawk -v 'a=\.' 'BEGIN {print a}'
gawk: warning: escape sequence `\.' treated as plain `.'
.
$ gawk5.0.1 -v 'a=@/foo/' BEGIN {print a}'
foo

Все awk работают одинаково для допустимых управляющих последовательностей:

$ a='\\-\b' awk 'BEGIN {print ENVIRON["a"]}' | od -tc
0000000   \   \   -   \   b  \n
0000006

(содержимое $ a передается как есть)

$ awk -v a='\\-\b' 'BEGIN {print a}' | od -tc
0000000   \   -  \b  \n
0000004

( \\ изменен на \ и \ b изменен на символ возврата на пробел).

20
29.04.2021, 00:41

Нет, но вы можете просто интерполировать шаблон в строку, заключенную в двойные кавычки, которую вы передаете в awk:

awk -v l="$line" "BEGIN {p=0}; /$pattern/ {p=1}; END{ if(p) print l >> \"outfile.txt\" }"

Обратите внимание, что теперь вам нужно избежать двойного -в кавычках awk буквально, но это все еще самый простой способ добиться этого.

0
29.04.2021, 00:41

Попробуйте что-нибудь вроде:

awk -v l="$line" -v search="$pattern" 'BEGIN {p=0}; { if ( match( $0, search )) {p=1}}; END{ if(p) print l >> "outfile.txt" }'
5
29.04.2021, 00:41

Вы можете использовать функцию eval, которая в этом примере разрешает переменную nets перед запуском awk.

nets="searchtext"
eval "awk '/"${nets}"/'" file.txt
-3
20.08.2021, 12:54

Теги

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