Как я могу использовать sed\awk для поиска определенных строк в файле, а затем найти все последующие строки, которые соответствуют другому шаблону?

Оператор returnвозвращает ошибку, если оператор не выполняется из функции или точечного -скрипта (исходного скрипта ).

В функциях оболочки и сценариях с точкой -используйте return. В сценариях используйте exit.

Короткий скрипт типа

#!/bin/bash

return 0

выдаст сообщение об ошибке

line 1: return: can only `return' from a function or sourced script

и $?будет установлено на 1.

Если вы не выходите из скрипта с явнымexit(или если вы выходите с exit, но без указания кода выхода ), код возврата скрипта в целом будет таким же, как код возврата последняя выполненная команда.

Наличие exit "$?"равнозначно простому exit, и если оно находится в конце скрипта, его можно полностью исключить.


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

1
14.04.2020, 14:02
3 ответа

Вы можете использовать awkдля этой цели:

awk 'index($0,"vm-1178")>0 {in_pat=1; print; next} \
in_pat == 1 && $0 ~ /^-->/ {print; next} \
{in_pat=0}' logfile.txt

Он содержит три правила:

  • Первое правило будет искать строки, содержащие шаблон, и печатать их, а также устанавливать внутренний флаг in_patравным 1.
  • Второе правило гласит, что все последующие строки, начинающиеся с -->, также будут напечатаны.
  • Третье правило используется для сброса этого флага в самой первой строке , не содержащей шаблон или не начинающейся с -->, так что ничего не печатается до тех пор, пока шаблон не будет найден снова.

Обратите внимание, что в первом правиле используется функция index, а не соответствие RegExp. Это сделано для того, чтобы вы также могли искать шаблоны, содержащие символы, имеющие особое значение в регулярных выражениях.

3
19.03.2021, 02:29

Если использовать Perl, это будет работать:

 perl -ne ' { $t=0 if ( !/^-->/ ); $t=1 if(/vm-1178/); print if($t); }' <filename>
-1
19.03.2021, 02:29

Попробуйте это,

awk '!/^-->/{p=0} /vm-1178/{p=1} p'
  • !/^-->/{p=0}:Установите varp(как print )в 0, если строка не начинается с -->.
  • /vm-1178/{p=1}:Установите var p= 1 всякий раз, когда строка соответствует /vm-1178/.
  • p:Печатать строку всякий раз, когда pистинно (здесь=1)
6
19.03.2021, 02:29

Теги

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