[1128682] Я нашел этот инструмент, который точно соответствует моей потребности, называется
logtop
. Согласно документации:
logtop[1129771] отображает в реальном времени количество строк, полученных на стандартном входе.
Примеры
Полезны для некоторых случаев, например, для получения IP-флуда вашего сервера:
Или для верхней жужжащей статьи вашего блога:
Fedora/CentOS/RHEL
Чтобы скомпилировать ее:
ssh user@192.168.x.xxx /path/to/script
Вы можете установить ее или запустить из этого каталога, [1129159]. /logtop[1129160].
Пример
ssh user@dbhost "mysqldump" > dumpfile
Входные данные видны ориентированы на абзац, поэтому давайте прочитаем его как абзац вместо строки:
awk -v RS="\n=\n" '
/PRIMER_LEFT_NUM_RETURNED=[^0]/ {
n = split($0, lines, /\n/)
for (i=1; i<=n; i++) {
if (lines[i] ~ /^(SEQUENCE_ID|SEQUENCE_TEMPLATE|PRIMER_LEFT_NUM_RETURNED|PRIMER_RIGHT_NUM_RETURNED|PRIMER_INTERNAL_NUM_RETURNED|PRIMER_PAIR_NUM_RETURNED|[^=]+_0[^=]*)=/)
print lines[i]
}
print "="
}
' input.file
или эквивалент Perl (позволяет более читаемыми «расширенными» регулярными выражениями
perl -0777 -ne '
BEGIN {
$wanted = qr{
^ # at the beginning of the string
(?: SEQUENCE_ID # match one of these words
| SEQUENCE_TEMPLATE
| PRIMER_LEFT_NUM_RETURNED
| PRIMER_RIGHT_NUM_RETURNED
| PRIMER_INTERNAL_NUM_RETURNED
| PRIMER_PAIR_NUM_RETURNED
| [^=]+_0[^=]*
)
= # followed by an equal sign
}x
}
for (split /^=$/m) {
if (/PRIMER_LEFT_NUM_RETURNED=[^0]/) {
print join("\n", grep {$_ =~ $wanted} split /\n/), "\n=\n";
}
}
# or, as a single command:
#
# print
# map {join("\n", grep {$_ =~ $wanted} split /\n/) . "\n=\n"}
# grep {/PRIMER_LEFT_NUM_RETURNED=[^0]/}
# split /^=$/m
' input.file
Вы можете установить разделитель записей на \n=\n
, то есть новую строку, a =
, а затем снова новую строку. Это позволит вам использовать awk по своему усмотрению:
$ awk -v RS='\n=\n' -v OFS="\n" '!/PRIMER_LEFT_NUM_RETURNED=0/{print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,RS}' file
SEQUENCE_ID=Contig1
SEQUENCE_TEMPLATE=AAGTCGCCCCTCCAT
PRIMER_LEFT_NUM_RETURNED=2
PRIMER_RIGHT_NUM_RETURNED=2
PRIMER_INTERNAL_NUM_RETURNED=0
PRIMER_PAIR_NUM_RETURNED=5
PRIMER_PAIR_0_PENALTY=7.398828
PRIMER_LEFT_0_SEQ=AAGTCGCCCC
PRIMER_RIGHT_0_SEQ=aaaagaca
PRIMER_LEFT_0=0,20
PRIMER_RIGHT_0=69,20
PRIMER_LEFT_0_END_STABILITY=2
PRIMER_RIGHT_0_END_STABILITY=3
PRIMER_PAIR_0_PRODUCT_SIZE=70
=
SEQUENCE_ID=Contig22
SEQUENCE_TEMPLATE=CCGTCGCCCC
PRIMER_LEFT_NUM_RETURNED=3
PRIMER_RIGHT_NUM_RETURNED=3
PRIMER_INTERNAL_NUM_RETURNED=0
PRIMER_PAIR_NUM_RETURNED=5
PRIMER_PAIR_0_PENALTY=7
PRIMER_LEFT_0_SEQ=AAGTCGCC
PRIMER_RIGHT_0_SEQ=agaGAGTA
PRIMER_LEFT_0=0,20
PRIMER_RIGHT_0=69,20
PRIMER_LEFT_0_END_STABILITY=2
PRIMER_RIGHT_0_END_STABILITY=3
PRIMER_PAIR_0_PRODUCT_SIZE=70
=
Это, однако, предполагает, что поля с _0
всегда будут одинаковыми. Если это не так, вы можете сделать что-нибудь вроде:
$ awk -v RS='\n=\n' -v OFS="\n\n" '!/PRIMER_LEFT_NUM_RETURNED=0/{printf "%s\n\n", $0}' file |
grep -P 'SEQUENCE_ID|SEQUENCE_TEMPLATE|PRIMER_LEFT_NUM_RETURNED|PRIMER_RIGHT_NUM_RETURNED|PRIMER_INTERNAL_NUM_RETURNED|PRIMER_PAIR_NUM_RETURNED|_0'
Прямой путь:
awk '$3 !~ "=0"{print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,RS}' RS='=\n' FS='\n' OFS='\n' file
После =
добавится дополнительная пустая строка, которую можно легко удалить.