Прежде всего, в начале команды cat нет необходимости.Вы можете перенаправить вывод файла в awk, используя " Для каждой строки в файле печатается первое поле, за которым следуют все совпадения регулярных выражений, найденные в каждом из оставшихся полей (если есть). Поля вывода разделены пробелами; это можно изменить, отредактировав начальный пробел во второй команде printf. awk -F"|" '{
printf "%s", $1;
for (i=2; i<=NF; i++) {
if (match($i, /\[(.*?)>/)) {
printf " %s", substr($i,RSTART,RLENGTH);
}};
printf "\n"
}' x.txt
Использование awk в режиме абзаца
awk -vRS='\n[ \t]*--' '
match($0, /\( *[0-9]+\)/) {print $1, substr($0,RSTART,RLENGTH)}
' file
foo-6-25.example.com: ( 49)
foo-5-4.example.com: ( 19)
foo-8-28.example.com: ( 43)
foo-9-7.example.com: ( 91)
foo-5-19.idmz.example.com: ( 19)
foo-7-3.example.com: ( 20)
< file perl -pe 's/\n//g;s/(foo)/\n$1/g' | perl -pe 's/:.*\(/: (/g'
awk
решение
$ awk '/:/{d=$1}/Speed/{printf"%-28s%s\n",d,substr($0,length($0)-4)}' file
foo-6-25.example.com: ( 49)
foo-5-4.example.com: ( 19)
foo-8-28.example.com: ( 43)
foo-9-7.example.com: ( 91)
foo-5-19.idmz.example.com: ( 19)
foo-7-3.example.com: ( 20)
$
awk
+ column
раствор
Динамическое выравнивание столбцов.
$ awk '/:/{d=$1}/Speed/{print d,substr($0,length($0)-4)}' file|column -to' '
foo-6-25.example.com: ( 49)
foo-5-4.example.com: ( 19)
foo-8-28.example.com: ( 43)
foo-9-7.example.com: ( 91)
foo-5-19.idmz.example.com: ( 19)
foo-7-3.example.com: ( 20)
$
$ sed -e '/--/d;N;s/\n/ /;s/[[:blank:]]\+//;s/[[:blank:]]\+[^(]\+/, /' file | column -ts ','
foo-6-25.example.com: ( 49)
foo-5-4.example.com: ( 19)
foo-8-28.example.com: ( 43)
foo-9-7.example.com: ( 91)
foo-5-19.idmz.example.com: ( 19)
foo-7-3.example.com: ( 20)
Если вам не нужны интервалы/выравнивание 2-го столбца, вы можете пропустить команду column
:
$ sed -e '/--/d;N;s/\n/ /;s/[[:blank:]]\+//;s/[[:blank:]]\+[^(]\+/ /' file
foo-6-25.example.com: ( 49)
foo-5-4.example.com: ( 19)
foo-8-28.example.com: ( 43)
foo-9-7.example.com: ( 91)
foo-5-19.idmz.example.com: ( 19)
foo-7-3.example.com: ( 20)
Если вы имеете дело с GNU sed
, вы можете уменьшить его еще больше:
$ sed -e '/--/d;N;s/\n/ /;s/[ ]\+//;s/[ ]\+[^(]\+/ /' file
% perl -ne 'print(($_.= <>) =~ s/\n.*\(/ (/r) if /:/' input.file
выходы:
foo-6-25.example.com: ( 49)
foo-5-4.example.com: ( 19)
foo-8-28.example.com: ( 43)
foo-9-7.example.com: ( 91)
foo-5-19.idmz.example.com: ( 19)
foo-7-3.example.com: ( 20)
объяснение:
:
, он добавляет следующую строку к текущей записи. (
, заменяет ее на (
и печатает запись. perl
вызывается с помощью -n
, незатронутые записи не печатаются. Sed
имеет очень компактный способ записи того же:
sed -ne '/:/N;s/\n.*(/ (/p' input.file
$ sed -nE '/:/{N;s/^[[:space:]]+//; s/:[^(]+/: /p;}' file
foo-6-25.example.com: ( 49)
foo-5-4.example.com: ( 19)
foo-8-28.example.com: ( 43)
foo-9-7.example.com: ( 91)
foo-5-19.idmz.example.com: ( 19)
foo-7-3.example.com: ( 20)
Если в каждой строке нет начальных пробелов или табуляции, то просто
sed -nE '/:/{N;s/:[^(]+/: /p;}' file
(первый)sed
скрипт с аннотациями (предполагает -E
и-n
):
/:/{ # this line contains a host name
N; # append the next line from the input
s/^[[:space:]]+//; # remove the initial spaces or tabs
s/:[^(]+/: /p; # remove the bit between the ":" and "(" and print
}