UNIX .gzファイルの内容を印刷する

UNIX .gzファイルの内容を印刷する

次の内容を含む .gz ファイルがあります。

ID:123455   23-07-2015 mvni
warning: RTM post
warning : no profile data

no profile data文字列を使用してIDを印刷したいです。行の前後にgrepを試しましたが、うまくいきません。他の方法を提案してください。

答え1

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

user3188445が指摘したように、zgrepgrepは(おそらく圧縮された)ファイル内の文字列を探します。警告一致する前に2行を印刷するために使用され、-B2一致するすべてのファイルのIDを抽出するために標準を使用します。grepstdout

これは、圧縮ファイルが複数あるか、同じファイル内に複数の一致するセクションがあるかに関係なく適用されます。

答え2

zcatあるいは、コマンドはgzip -dcgzip圧縮ファイルの出力を解凍してstdoutとして印刷します。たとえば、を実行できます。ただし、ほとんどのシステムにはすでにこれを実行するzcat file.gz | grep '^ID:'コマンドがあります。zgrep

修正する

これらのファイルが複数あり、特定の警告を含むID行をファイルに印刷したい場合は、次のようにします。

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

最初のコマンドは、zgrep -l警告を含むファイルのリストを印刷します。 2 番目のコマンドはxargs標準入力の引数リストを受け入れ、すべての入力に対してコマンドを実行します。zgrep必要なID行を印刷するために実行されるコマンドも同じです。

セカンドアップデート

数値IDのみを抽出するには、前述のコマンドを受けて追加してください。

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

これにより、ID番号のみが印刷されます。

答え3

zgrepを使用して.gzファイルをgrepできます。私はあなたが次のようなことをしたいと思います。

zgrep -B 2 'warning : no profile data' file.gz

答え4

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/'

関連情報