Команда zcat
или gzip -dc
распакует и распечатает вывод gzip-файла на стандартный вывод. Таким образом, вы можете запустить, например, zcat file.gz | grep '^ ID:'
. Однако в большинстве систем есть команда zgrep
, которая уже делает это за вас.
В предположении, что у вас есть куча этих файлов и вы хотите распечатать строку идентификатора из файлов, содержащих конкретное предупреждение, вы можете сделать следующее:
zgrep -l 'warning : no profile data' *.gz | xargs zgrep '^ID:'
Первая команда, zgrep -l
, выводит список файлов, содержащих предупреждение. Вторая команда, xargs
, принимает список аргументов на стандартном вводе и запускает команду для всех вводов. Команда, которую он запускает, также имеет вид zgrep
, чтобы напечатать нужную строку идентификатора.
Чтобы извлечь только числовой идентификатор, возьмите команду, которую я предлагал ранее, и добавьте
| sed -e 's/^ID:\([0-9]*\) .*/\1/'
. Это просто напечатает номер идентификатора.
$ zgrep -B2 'warning : no profile data' *.gz | grep -o '^ID:[0-9]*'
ID:123455
Как указано пользователем3188445, zgrep
будет искать строки в (возможно, сжатых) файлах с помощью grep. Использование -B2
для печати 2 строк до совпадения предупреждения, затем извлечение идентификаторов всех совпадающих файлов с помощью стандартного grep
против stdout
.
Это будет работать независимо от того, есть ли у вас несколько сжатых файлов или несколько совпадающих разделов в одном файле.
Если у вас есть доступ к утилитам GNU, это должно сработать:
zgrep -B2 "no profile data" file | grep -oP 'ID:\K\d+'
Если это не сработает, вы можете попробовать вместо этого:
zcat file.gz | grep -B2 "no profile data" | sed -n 's/ID:\([0-9]*\).*/\1/p'
Или:
zcat file.gz |
awk '{if(/^ID/){split($1,a,/:/); id=a[2];}if(/no profile data/){print id}}'
Или:
zcat file.gz | perl -lne '$id=$1 if /^ID:(\d+)/; print $id if /no profile data/'
Вы можете использовать zgrep для поиска файла .gz. Я подозреваю, что вам нужно что-то вроде:
zgrep -B 2 'warning : no profile data' file.gz