UNIX для печати содержимого из файла .gz

[112384] Ну, да. В manpage моей системы Debian написано [112687] "Когда за [112862]+L[112863] следует номер, будут перечислены только файлы с количеством ссылок [112864] меньше [112865] этого номера"

1
23.07.2015, 20:43
4 ответа

Команда zcat или gzip -dc распакует и распечатает вывод gzip-файла на стандартный вывод. Таким образом, вы можете запустить, например, zcat file.gz | grep '^ ID:' . Однако в большинстве систем есть команда zgrep , которая уже делает это за вас.

update

В предположении, что у вас есть куча этих файлов и вы хотите распечатать строку идентификатора из файлов, содержащих конкретное предупреждение, вы можете сделать следующее:

zgrep -l 'warning : no profile data' *.gz | xargs zgrep '^ID:'

Первая команда, zgrep -l , выводит список файлов, содержащих предупреждение. Вторая команда, xargs , принимает список аргументов на стандартном вводе и запускает команду для всех вводов. Команда, которую он запускает, также имеет вид zgrep , чтобы напечатать нужную строку идентификатора.

Второе обновление

Чтобы извлечь только числовой идентификатор, возьмите команду, которую я предлагал ранее, и добавьте

| sed -e 's/^ID:\([0-9]*\) .*/\1/'

. Это просто напечатает номер идентификатора.

2
27.01.2020, 23:13
$ zgrep -B2 'warning : no profile data' *.gz | grep -o '^ID:[0-9]*'
ID:123455

Как указано пользователем3188445, zgrep будет искать строки в (возможно, сжатых) файлах с помощью grep. Использование -B2 для печати 2 строк до совпадения предупреждения, затем извлечение идентификаторов всех совпадающих файлов с помощью стандартного grep против stdout .

Это будет работать независимо от того, есть ли у вас несколько сжатых файлов или несколько совпадающих разделов в одном файле.

3
27.01.2020, 23:13

Если у вас есть доступ к утилитам 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/'
1
27.01.2020, 23:13

Вы можете использовать zgrep для поиска файла .gz. Я подозреваю, что вам нужно что-то вроде:

zgrep -B 2 'warning : no profile data' file.gz
1
27.01.2020, 23:13

Теги

Похожие вопросы