Как выполнить поиск многострочного шаблона с помощью awk в unix?

Каков самый быстрый способ через терминал просматривать мои каталоги и файлы, самые большие первые или самые новые и т. Д.

Вы можете использовать команду find для отображения файлов с их размерами в удобочитаемом формате:

find / -type f -size +300000k -exec ls -lh {} \; | awk '{ print $9 ": " $5 }'

отрегулируйте значение + 300000k .

2
10.02.2017, 09:55
3 ответа

Предполагая, что SQL использует ; в качестве разделителей операторов:

$ cat statements.sql
First bit;
Second thing;

More
of the same;

select * from dept where department_name in ('abc'
, 'xyz', 'def') ;

Getting to the end;

The
End;

Тогда вы можете использовать ; в качестве записи разделитель в awk и соответствует как обычно:

$ awk 'BEGIN { RS=";" } /department_name in ([^)]+)/ { print $0 ";" }' statements.sql


select * from dept where department_name in ('abc'
, 'xyz', 'def') ;

Шаблон, / имя_отдела в ([^)] +) / соответствует строке имя_отдела в ( за которым следует один или несколько символов, не являющихся ) (включая символы новой строки), за которыми следует один ) .

Оператор print добавляет ; в конец записи, поскольку этот ; был удален awk (он удаляет все записи разделители).

Вы получите несколько дополнительных пустых строк, поскольку в файле были пустые строки после предшествующих ; . Вы можете отфильтровать их с помощью sed -n '/ [[: graph:]] / p' : ​​

$ awk 'BEGIN {RS=";"} /department_name in ([^)]+)/ { print $0 ";" }' statements.sql |
  sed -n '/[[:graph:]]/p'
select * from dept where department_name in ('abc'
, 'xyz', 'def') ;
3
27.01.2020, 21:56

Надеюсь, это ответ, который вы ищете:

grep -oE 'department_name.*\)' file_name

PS не знаю, как решить эту проблему с помощью awk.

0
27.01.2020, 21:56

Вы можете использовать awk и разделитель записей RS :

$ cat << EOT | awk -v RS="department_name|)" 'NR%2==0'
> select * from dept where department_name in ('abc' , 
> 'xyz', 
> 'def') ;
> EOT
in ('abc' , 
'xyz', 
'def'

RS установлен на либо имя_отдела , либо ) , таким образом запись может состоять из нескольких строк.

Если у вас нет двух одинаковых тегов, NR% 2 = 0 напечатает все, что находится между двумя разными тегами.

2
27.01.2020, 21:56

Теги

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