grep
.gzファイルを使用せずに検索キーワードの前の行を印刷するにはどうすればよいですか?
ID:342N000390AAAAAAAA 07/14/15 10:26 (MV90 )
* Register Data Imported
* Warning - No Profile Data
07/14/15 10:24 05/13/15 08:16 15 1 5956
No Profile
キーワードを検索して342N000390AAAAAAAAAのID番号を印刷したいです。 3行目には必ずしも「プロファイルなし」は表示されません。どの行にも表示できます。私のオペレーティングシステムはHP-UXなので、多くのコマンドは使用できません。
答え1
あなたが使用できるawk
:
gzcat file.gz | awk '/No Profile Data/{printf "%s\n%s\n%s\n", b, a, $0} {b=a;a=$0}'
gzcat
(またはzcat
Linuxの場合)gzipファイルの内容を標準出力として印刷します。awk
次に文字列を検索し、"No Profile Data"
最初の2行を印刷します。
答え2
編集済み
新しい方法:改行を削除します。
各gzip圧縮ファイルに1つのIDしかないと仮定すると、次のことを試すことができます。
gunzip -c file.gz | sed -e ':a;N;$!ba;s/\n/ /g' -e '/^[[:space:]]/d' -e 's/^ID:\([[:alnum:]]*\).*Warning - No Profile Data.*/\1/' -e '/^ID:/d'
gunzip -c
ファイルを抽出してstdout
sed
すべての行を1つに折りたたんでから始まらないすべての行を削除し、一致するファイルからID:
IDを抽出し、IDが表示されるか、何も表示されないファイルと一致しない行を削除します。 。
クレジットに帰属https://stackoverflow.com/a/1252191/5148242そしてhttps://unix.stackexchange.com/a/218094/124507@黑心
オリジナル
grep
それでも適切なオプションですが、練習にはsed
結果とpaste
部品の検索を使用できます-B2
。
zcat nogrep.gz | paste - - - | sed -e '/^[[:space:]]/d' -e 's/^ID:\([[:alnum:]]*\).*Warning - No Profile Data/\1/' -e '/^ID:/d'
paste
3本のワイヤで構成される各グループを接続します。sed
開始されていない行をすべて削除し、一致するファイルからIDを抽出し、ファイルと一致しID:
ない行を削除してID:
IDが表示されたり、何も表示されないようにします。
答え3
(希望)最終製品
find . -name \*.gz -type f -exec gzcat {} + |
sed -ne'/^ *ID:/h;/No Profile/!d;x' \
-e's/^ *ID:\([^ ]*\).*/\1/p'
したがって、find
ファイル名がパターンと一致する現在のディレクトリのすべての一般ファイルを再帰的にルートし、単一*.gz
ストリームzcat
内の各ファイルをsed
標準入力に繰り返し圧縮解除するために、できるだけ少ない回数を呼び出します。
sed
文字列で始まる行への入力を取得します。*ID:
。見つかったら、前のh
コピーを作成し、次を探します。No Profile
また、d
一致しないすべての行を削除します。見つかったら、sed
予約済みのスペースと交換してクリーンアップしようとします。^ *ID:
:
行は、最初の項目と次の項目の間の部分にのみ存在します。<スペース>。成功するとsed
p
結果を印刷します。
〜のように@DarkHeartが指摘しました。ただし、HPUXシステムでは、zcat
コマンド名をに変更する必要があります。gzcat
多様性
これは、文字列の一致の直前に発生する行のペアを単一のファイルから取得するために必要なすべてです。No Profile
:
gzip -d <file.gz |
sed -e'1N;$!N;/\n.*No Profile/P;D'
これにより、一度に3行の入力のみがスキャンされます。各行は\n
パターン空間で改行で区切られます。各N
新しい行をインポートすると、最も古い行がD
削除されます。\n.*No Profile
パターン空間で正規表現が一致したことがある場合(パターン空間の最新行の場合、2番目の最新行の場合は次のサイクル)、最も古い行を印刷します。したがって、以前に発生した2行が得られます。No Profile
。見つかった行も印刷するには...
gzip -d <file.gz |
sed -e'1N;$!N;/No Profile/P;D'
そしてfind
:
find . -name \*.gz -type f -exec zcat {} + |
sed -e'1N;$!N;/No Profile/P;D'
必要に応じて、.
ディレクトリ名に変更できます。追加することもできます。\n.*No Profile
一致する行が印刷されないようにするには、ビットを使用してください。このコマンド.
は、あなたの好みに合わない限り、次のように繰り返されます。
find . \! -name . -prune -name \*.gz \
-type f -exec zcat {} + |
sed -e'1N;$!N;/No Profile/P;D'
特にリーダーを探しているならID
フィールドで、一致の前の2行が見つかる場合にのみNo Profile
あなたはできます:
find . -name \*.gz -type f -exec zcat {} + |
sed -ne'/^ID/!D;/\n/!N;N' \
-e's/ .*\n.*\n.*No Profile.*//p;D'
...これはリーダーのみを印刷しますID
フィールドはすべて/すべてに表示できます。*.gz
ファイルfind
呼び出しのzcat
印刷と次の場合にのみID
前に2行が出なければなりません。No Profile
マッチ。