Использование опции -o
параметра ps
позволяет пользователю -задать формат вывода. Мы также можем отсортировать этот вывод для представления «top -25». Однако наложение параметра «лес» или иерархии процессов невозможно при выборе ps... --sort...
. Добавление PPID к выходным данным может выявить иерархические отношения.
Конкретно в вашем случае мы могли бы сделать:
ps -e -ouser,time,cpu,vsz,ppid,pid,cmd --sort -time,user | head -26
Это упорядочивает выходные данные в порядке убывания времени (наибольшего значения, сначала ), а затем по пользователю внутри, чтобы дать 25 «верхних» процессов под строкой заголовка.
С awk
может быть:
$ awk -v FS="</?g>" '{print $2}' trsTest.txt
Good wheatear
The farm land is to be sold
knock knock
Или если вы хотите сохранить теги:
$ awk -v FS="</g> " '{print $1 FS}' trsTest.txt
<g> Good wheatear </g>
<g> The farm land is to be sold </g>
<g> knock knock </g>
Вы можете просто использовать GNU grep и печатать только совпадающую часть(-o
)строк:
grep -o '<g>.*<\/g>' trsTest.txt
Шаблон должен быть заключен в одинарные кавычки, чтобы оболочка не расширение символов (как*
)
Эта первая команда выдаст:
<g> Good wheatear </g>
<g> The farm land is to be sold </g>
<g> knock knock </g>
Если вы не хотите включать теги, вы можете сделать это:
sed 's/.*<g>\(.*\)<\/g>.*/\1/' trsTest.txt
Это работает следующим образом:
<g>
\(
и\)
<\g>
до конца строки \1
Эта вторая команда выдаст:
Good wheatear
The farm land is to be sold
knock knock
Сawk
:
awk '{if (match($0, /<g>.*<\/g>/))
print substr($0,RSTART,RLENGTH); }' input
В этой команде встроенный -в функцию match()
ищет регулярное выражение.
The match() function sets the predefined variable RSTART to the index. It also sets the predefined variable RLENGTH to the length in characters of the matched substring.
После нахождения индекса и длины регулярного выражения в текущей входной записи($0
)встроенная -функция substr(target,start,length)
получает ожидаемый результат.
Вы пробовали с awk '/<g>/, /<\/g>/' file
. Эта команда использует шаблон диапазона, в котором два шаблона разделены запятой. Поскольку шаблон диапазона выбирает записей , вы получаете целую строку.
если теги всегда одинаковые, чтобы включить теги, используйте sed
sed 's/\(.*>\).*/\1/' trsTest.txt
вывод:
<g> Good wheatear </g>
<g> The farm land is to be sold </g>
<g> knock knock </g>
Updated to Quasimodo's more efficient code block
Если это XML, вы можете использовать синтаксический анализатор XML, такой как xmlstarlet
. (Если это HTML, вы все еще можете использовать xmlstarlet
, но вы должны предупредить его, что структура может быть нарушена.)
Я добавил ограничивающий элемент <root/>
, чтобы входной XML-код был допустимым:
<root>
<g> Good wheatear </g> other parts of line
<g> The farm land is to be sold </g> other parts of line
<g> knock knock </g> other parts of line
</root>
И затем команда для выбора </g>
элементов и значений
xmlstarlet sel --template --match '//g' --copy-of '.' --nl file.xml
Выход
<g> Good wheatear </g>
<g> The farm land is to be sold </g>
<g> knock knock </g>
Преимущество xmlstarlet
по сравнению с универсальными инструментами анализа текста, такими как sed
или grep
, заключается в том, что он понимает структуру XML, поэтому, если входной файл немного изменится, оставаясь действительным XML, xmlstarlet
по-прежнему сможет чтобы разобрать его.
Другой способ сsed
:
sed -n '
s/<\/*g>/\n/g
s/^\n/<g>/
s/\n.*/<\/g>/
p
' data
<g>
и </g>
на новую строку:s/<\/*g>/\n/g
<g>
тег:s/^\n/<g>/
</g>
:s/\n.*/<\/g>/
p
Если вы также хотите удалить тег, команда sed
станет:
sed -n '
s/<\/*g>/\n/g
s/^\n//
s/\n.*//
p
' data
awk -F "</g>" '{print $1"</g>"}' filename
выход
<g> Good wheatear </g>
<g> The farm land is to be sold </g>
<g> knock knock </g>
ИспользованиеGNU awk
:
С помощью функции gensub()
(GNU awk
)вы можете печатать содержимое между тегами <g>
и </g>
, включая теги :
awk '{print gensub(/(<g>.*<\/g>)(.*)/,"\\1","g")}' file
<g> Good wheatear </g>
<g> The farm land is to be sold </g>
<g> knock knock </g>
или без тегов:
awk '{print gensub(/(<g>)(.*)(<\/g>)(.*)/,"\\2","g")}' file
Good wheatear
The farm land is to be sold
knock knock
Используя GNU sed
, мы разрезаем строку до тех пор, пока подстрока <g>
не появится впереди.
sed -n '
/^<g>/!s|<g>|\n&|;/\n/D
/^<g>/s|</g>|&\n|;/\n/P
' file
Метод с использованием Perl:
perl -ne ' print m{(<g>.*?</g>).*(.)}s' file
python3 -c 'import sys
ifile,s1,s2 = sys.argv[1:]
with open(ifile) as fh:
for l in fh:
p1 = l.find(s1)
p2 = l.find(s2,p1)
if p1 > -1 and p2 > -1:
print(l[p1:p2+len(s2)])
' file '<g>' '</g>'