0

いくつかのキーワードを含むテキスト ファイルはほとんどありません。これらのファイルから数行を選択して解析する必要があります。以下はサンプルファイルです。「顧客」をgrepして、ファイルから行を取得する必要があります。

13 Sun Sep  9 12:14:38 2012 : [P] Reproducer has the 167 number 
13 Sun Sep  9 12:14:38 2012 : [P] Customer has the 12.14.19.9 
13 Sun Sep  9 12:14:38 2012 : [P] Customer has the 12.14.89.9 
13 Sun Sep  9 12:14:38 2012 : [P] Reproducer has the 170 number 
13 Sun Sep  9 12:14:38 2012 : [P] Customer has the 12.4.89.16 

顧客を含む行のみを選択し、それを解析してタイムスタンプ (12:14:38) と番号 12.14.19.9 のみを取得する必要があります。複数のファイルに対してこれを行う必要があります。すべてのファイルは、ログの構造が同じです。以下のようなワンライナーを使用してこれを行いました

grep Customer Neigh.log | cut -d " " -f 5- | cut -d ":" -f 1-4 | cut -d " " -f 1,8

しかし、シェルスクリプト内でこれを行う必要があります。これどうやってするの。誰でも助けることができますか?

ありがとう

4

3 に答える 3

1

これは複数のファイルでも機能します。

awk '$0~/Customer/{print $5,$12}' *.txt
于 2012-09-13T12:43:49.227 に答える
1

わかった -

以下は簡単なシェル スクリプトです。

if [ $# -ne 1 ]; then
  echo Please enter a filename
else
  awk '/Customer/ {print $5, " ", $12}' $1
fi

1) 最初の行は、#/コマンド ライン引数 "$#" が 1 に等しいかどうかをチェックします。そうでない場合は、ファイル名を入力するように求められます。

2) 「awk」スクリプトは「cut」の代替です。行に「Customer」が含まれている場合にのみ、5 列目と 12 列目が出力されます。

3) 「awk」コマンドの末尾にある $1 は、シェル引数 #1、つまりファイル名です。

于 2012-09-13T05:31:04.043 に答える
0

を使用した片道GNU awk

for i in *.txt; do awk '/Customer/ { print $5, $NF > FILENAME".out" }' "$i"; done

使用している場合BSD awk:

for i in *.txt; do awk '/Customer/ { out=FILENAME".out"; print $5, $NF > out }' "$i"; done
于 2012-09-13T05:39:27.440 に答える