Поскольку shell вызывает программы типа ls в отдельных процессах, /proc/self будет отображаться как symlink на nnnnn, где nnnnn - идентификатор процесса ls. Насколько я знаю, в широко используемых оболочках нет встроенной функции для чтения симлинков, но в Perl она есть:
perl -e 'print "/proc/self link: ",readlink("/proc/self")," - pid $$\n";'
Итак, /proc/self ведет себя как симлинк, но файловая система procfs делает его "волшебным" процессом.
Использование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
Это на самом деле не абзацы , а от совпадения к совпадению.
Вы можете попробовать:grep -A3 DISK_info_start:$entry quota.txt
Попробуйте 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