Для этой версии Linux нужны только файлы /proc и ps. Он адаптирован из последней части отличного ответа @maxschlepzig . Эта версия считывает /proc непосредственно из оболочки, а не порождает подпроцесс -в цикле. Это немного быстрее и, возможно, немного элегантнее, как того требует заголовок этой темы.
#!/bin/dash
# Print all descendant pids of process pid $1
# adapted from https://unix.stackexchange.com/a/339071
ps=${1:-1}
while [ "$ps" ]; do
echo $ps
unset ps1 ps2
for p in $ps; do
read ps2 < /proc/$p/task/$p/children 2>/dev/null
ps1="$ps1 $ps2"
done
ps=$ps1
done | tr " " "\n" | tail -n +2
Это было бы проще сделать с awk
, чем сsed
:
$ awk -v RS='' -F '\n' '!($1 ~ /ZZZ$/)' file
sometext tobe here xxx_yyyy: AAA
sjhdajsh
skdjah
hjk
Это сначала устанавливает разделитель записей RS
на пустую строку. При этом специальном значении RS
awk
каждый абзац, разделенный одной или несколькими пустыми строками, будет рассматриваться как запись. С помощью -F '\n'
мы говорим awk
рассматривать каждую строку абзаца как поле.
Тест !($1 ~ /ZZZ$/)
будет верен для каждой записи (абзаца ), чье первое поле (1-й строки )не не заканчивается строкой ZZZ
. Каждый такой абзац будет напечатан.
Если вы хотите, чтобы после каждого выводимого раздела была пустая строка, добавьте -v ORS='\n\n'
в командную строку awk
(перед кодом awk
).
С помощью sed
вы могли бы сделать
$ sed '/ZZZ$/,/^$/d' file
sometext tobe here xxx_yyyy: AAA
sjhdajsh
skdjah
hjk
То есть «удалить все строки между любой строкой, оканчивающейся на ZZZ
, до следующей пустой строки». Вы также можете использовать выражение sed
/ZZZ$/,/^$/!p
с sed -n
. Обратите внимание, однако, что ZZZ
в любой другой строке, отличной от первой строки абзаца, также вызовет это удаление.
Очевидно, что эту проблему можно было бы решить (, прочитав абзацы построчно в отведенное место, а затем решив, какие из них напечатать, а какие отбросить ), но это превратилось бы в большую проблему. чем просто использование варианта awk
выше.
Просто чтобы прокомментировать выражение [^ZZZ]
, которое вы используете в вопросе. Это точно эквивалентно [^Z]
и будет соответствовать любому одиночному символу, который не является Z
. Точно так же [^text]
совпадает с [^etx]
и будет соответствовать любому одиночному символу, который не является e
, t
или x
.