Проверьте свои журналы на что-либо интересное, например. /var/log/messages
или /var/log/mail.log
.
Вы могли также открыть отдельную сессию SSH или консоль и присоединить strace
к процессу дурака, после того как Вы запустили его. Найдите pid с ps aux | grep mutt
на Вашей другой сессии/консоли, и делают
strace -p pid
Необходимо смочь понять то, что дурак зависает/разрушает на, или по крайней мере новый след для следования для поиска и устранения неисправностей. Можно также хотеть, добавляют -f
переключитесь на strace для следования за дочерними процессами, если он разветвляется. Сообщите мне то, что Вы находите...
Используйте оператор 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"
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
изменен на символ возврата на пробел).
Нет, но вы можете просто интерполировать шаблон в строку, заключенную в двойные кавычки, которую вы передаете в awk:
awk -v l="$line" "BEGIN {p=0}; /$pattern/ {p=1}; END{ if(p) print l >> \"outfile.txt\" }"
Обратите внимание, что теперь вам нужно избежать двойного -в кавычках awk буквально, но это все еще самый простой способ добиться этого.
Попробуйте что-нибудь вроде:
awk -v l="$line" -v search="$pattern" 'BEGIN {p=0}; { if ( match( $0, search )) {p=1}}; END{ if(p) print l >> "outfile.txt" }'
Вы можете использовать функцию eval, которая в этом примере разрешает переменную nets перед запуском awk.
nets="searchtext"
eval "awk '/"${nets}"/'" file.txt