2017-11-16 4 views
-1

例ログ(sample.log)と一致したキーワードをプリントアウト検索複数のキーワードやログのいくつかのフィールド

11:00:00 INFO KOREA AAABB DDDRR 
11:00:01 INFO SWEDEN TYTY PLO 
11:00:02 INFO US OIILL OTLTOL 
11:00:03 INFO NORTHKOREA OTL 

キーワード(複数) "KOREA"、 "OTL" 私はと欲しい

結果

11:00:00 KOREA 
11:00:02 OTL 
11:00:03 KOREA OTL 

私はawk fuctionを使用して考えています。同じであなたを助けるかもしれ しかし、私はawk後....

# $val_1 = KOREA 
# $val_2 = OTL 

# awk /$val_1|$val_2/'print{$1, $val_1, $val_2}' sample.log 

答えて

1

に失敗しました。より良い

awk ' 
function check(word){ 
    match($0,word); 
    if(substr($0,RSTART,RLENGTH)){ 
    return substr($0,RSTART,RLENGTH) 
}} 
{ 
    val=check("KOREA"); 
    val=val?$1 FS val FS check("OTL"):check("OTL")?$1 FS check("OTL"):check("OTL"); 
    if(val){ 
    print val}; 
    val="" 
}' Input_file 
+0

はサイコー多くのRavinderをありがとうございます!できます。もう1つ質問できますか? 10個のキーワードを使用している場合、コードにキーワークを追加するだけでよいですか? – user8159259

+0

@ user8159259、私はあなたの例が適切にコードを微調整するだけの2つの文字列のためにこれを書いていました。また、文字列のシーケンスはありますか?または任意の文字列が任意の行に来る可能性がありますか? 10行の文字列をすべて1行に入れて印刷したいのですか?同じことを私に教えてください。 – RavinderSingh13

1
$ cat infile 
11:00:00 INFO KOREA AAABB DDDRR 
11:00:01 INFO SWEDEN TYTY PLO 
11:00:02 INFO US OIILL OTLTOL 
11:00:03 INFO NORTHKOREA OTL 

$ awk -v search='KOREA|OTL' '{f=$1; s="";while(match($0,search)){s=(s?s OFS:"") substr($0,RSTART,RLENGTH);$0=substr($0,RSTART+RLENGTH)}if(s)print f,s}' infile 
11:00:00 KOREA 
11:00:02 OTL 
11:00:03 KOREA OTL 

読み取り可能:

awk -v search='KOREA|OTL' '{ 
      f=$1; 
      s=""; 
      while(match($0,search)) 
      { 
       s = (s?s OFS:"") substr($0,RSTART,RLENGTH); 
       $0 = substr($0,RSTART+RLENGTH) 
      } 
      if(s) 
       print f,s 
      } 
      ' infile 
+1

ありがとうございました。 – user8159259

+0

@ user8159259 https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-workをお読みください –

関連する問題