2016-11-28 34 views
0

我有目標線,我想「grep」可以記錄大量的日誌文件,如:片串與多個分隔符

EGPA019_90pc.recode.2.log:Cross-Entropy (masked data): 0.556984 

我要切出「2」和「0.556984」與間隔一個選項卡文件

所以,如果我輸入:

grep "Cross-Entropy (masked data):" *.log | cut -d '.' -f 3 >> targetFile.txt 

我得到的 「2」,以及:

grep "Cross-Entropy (masked data):" *.log | cut -d ' ' -f 4 >> targetFile.txt 

我得到「0.556984」。但我怎樣才能在一行代碼中獲得「2」,然後是我的目標文件中同一行的「0.556984」選項卡?

非常感謝

克萊夫

回答

2

您可以使用grep和一點bash內置的正則表達式功能。

grep -h "Cross-Entropy (masked data):" *.log | while IFS= read -r string; do 
     [[ "$string" =~ .recode.([[:digit:]]+).*:\ (.*)$ ]] 
     printf "%s\t%s\n" "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]//[[:blank:]]}"; 
done 

我輸入文件

$ cat *.log 
EGPA019_90pc.recode.2.log:Cross-Entropy (masked data): 0.556984 
EGPA019_90pc.recode.9.log:Cross-Entropy (masked data): 0.996984 
EGPA019_90pc.recode.7.log:Cross-Entropy (masked data): 0.756984 

$ grep -h "Cross-Entropy (masked data):" *.log | while IFS= read -r string; do 
     [[ "$string" =~ .recode.([[:digit:]]+).*:\ (.*)$ ]] 
     printf "%s\t%s\n" "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]//[[:blank:]]}"; done 
2  0.556984 
9  0.996984 
7  0.756984 

說明: - 使用

  1. 上午內置bash正則表達式功能來捕捉,而不是使用其他原生工具所需要的字符串。
  2. 輸入grep的輸出爲應用regEx [ "$string" =~ recode.([[:digit:]]+).*:\ (.*)$ ]],它捕獲您所需的條目,數字和十進制數字。
  3. 使用printf來打印這些變量。第二屆捕獲,即十進制數字有空格字符開頭,由"${BASH_REMATCH[2]//[[:blank:]]}"

刪除它,你也可以圍繞一個shell腳本把它包裝成如下: -

#!/bin/bash 

while IFS= read -r string; do 
    [[ "$string" =~ .recode.([[:digit:]]+).*:\ (.*)$ ]] 
    printf "%s\t%s\n" "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]//[[:blank:]]}" 
done < <(grep -h "Cross-Entropy (masked data):" *.log) 

或者)使用grep用PCRE標記-P選項和xargs來過濾輸出。

grep -Pho '\.recode\.\K\d+|: \K.*' *.log | xargs -n2 -d'\n' 
2 0.556984 
9 0.996984 
7 0.756984 

(或)使用更簡單perl正則表達式的語法。

perl -lne 'print "$1 $2" if /\.recode\.(\d+).*:\s+(.*)/' *.log 
2 0.556984 
9 0.996984 
7 0.756984 
+0

嗨,這只是給了我一個很大的空白沒有我想要的信息。謝謝 – user3329732

+0

什麼是印刷:?你能分享輸出嗎?在你給出的示例文本中,它對我很好。要麼你錯誤地調用它或者你的輸入行不同 – Inian

+0

我在輸入中有10行,我得到了10行空白。您的輸入看起來完全相同 – user3329732

0

我想我會利用這個awk而不是解析的grep輸出做。

我沒有你的數據集來測試這個,但在我看來,下面應該工作。

awk '/^Cross-Entropy \(masked data\):/ {split(FILENAME,a,".");printf("%s\t%s\n", a[3], $NF}' *.log 

這是一個單線程有點長。作爲一個獨立的腳本,它可能看起來像這樣:

#!/usr/bin/awk -f 

/^Cross-Entropy \(masked data\):/ { 
    split(FILENAME,a,".") 
    printf("%s\t%s\n", a[3], $NF 
} 

保存在一個文件中,使其可執行,你有你自己一個全新的shell命令。

請注意,這是通過使用字段拆分,而不是通過使用正則表達式。

0

您可以刪除不想要的事情sed

grep "Cross-Entropy (masked data):" *.log | sed 's/.*recode.//;s/\..*: //' 

grepsed可以組合:

sed -n '/Cross-Entropy (masked data):/ {s/.*recode.//;s/\..*: //;p}' *.log