извлечь совпадение абзаца со словами, используя sed или awk [дубликат]

Поскольку shell вызывает программы типа ls в отдельных процессах, /proc/self будет отображаться как symlink на nnnnn, где nnnnn - идентификатор процесса ls. Насколько я знаю, в широко используемых оболочках нет встроенной функции для чтения симлинков, но в Perl она есть:

perl -e 'print "/proc/self link: ",readlink("/proc/self")," - pid $$\n";'

Итак, /proc/self ведет себя как симлинк, но файловая система procfs делает его "волшебным" процессом.

1
15.10.2018, 15:14
3 ответа

Использованиеawk:

Используйте awkв режиме абзаца:

awk -v RS= '/DISK_info_start\:\/usr\n/' quota.txt

Если вы сопоставляете несколько абзацев, добавьте -v ORS="\n\n", в противном случае awkудаляет пустые строки между совпадениями.

Обратите внимание, что вам нужно \nвместо $, чтобы найти конец строки, так как последний отмечает только конец абзаца.

Если вам нужны переменные, обязательно укажите/:

в кавычках.
entry=/usr
awk -v RS= "/DISK_info_start\:${entry//\//\\\/}\n/" quota.txt

Использованиеperl:

perlтакже имеет режим абзаца(-00):

perl -00 -ne '/DISK_info_start\:\/usr\n/ && print' quota.txt

Добавьте | tr -s '\n', чтобы не печатать пустую строку в конце.


Использованиеsed:

Вы также можете использовать sedвот так:

sed -n '/DISK_info_start:\/usr$/,/DISK_info_end:\/usr$/p' quota.txt

Это на самом деле не абзацы , а от совпадения к совпадению.

2
27.01.2020, 23:31

Вы можете попробовать:grep -A3 DISK_info_start:$entry quota.txt

-1
27.01.2020, 23:31

Попробуйте awk, это хорошо для обработки текста:

awk 'index($0, "DISK_info_start:"D"\n")==1' RS="" ORS="\n\n" D="/usr" quota.txt

DISK_info_start:/usr
Disk: /usr
CURRENT=81
DISK_info_end:/usr
1
27.01.2020, 23:31

Теги

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