2013-01-07 67 views
1

我是Linux新手,並且有一個非常大的文本日誌文件可以從中提取。我想用bash?使用bash從文件中提取文本

例如,文件包含:

Node:xyz 
Time:01/07/13 14:26:17 
INFO: Trusted certif ok 

Node:abc 
Time:01/07/13 14:26:18 
INFO: Trusted certif ok 

Node:def 
Time:01/07/13 14:26:18 
INFO: Trusted certif not ok 

我需要提取節點後的文字:並把它添加到信息後的文字:顯示在一行,輸出重定向到一個新文件。我正在嘗試awk和sed,但還沒有弄明白。非常感謝。

輸出示例如下所示:

xyz Trusted certif ok 
abc Trusted certif ok 
dbf Trusted certif not ok 

回答

7

試着這樣做:

awk -F: '/^Node/{v=$2}/^INFO/{print v $2}' file.txt 

while IFS=: read -r c1 c2; do 
    [[ $c1 == Node ]] && var=$c1 
    [[ $c1 == INFO ]] && echo "$var$c2" 
done < file.txt 

perl -F: -lane ' 
    $v = $F[1] if $F[0] eq "Node"; 
    print $v, $F[1] if $F[0] eq "INFO" 
' file.txt 

(在文件中,使用方法:./script.py file.txt):

import sys 
file = open(sys.argv[1]) 
while 1: 
    line = file.readline() 
    tpl = line.split(":") 
    if tpl[0] == "Node": 
     var = tpl[0] 
    if tpl[0] == "INFO": 
     print var, tpl[1] 
    if not line: 
     break 
+2

+1爲awk解決方案。不要使用bash解決方案。 –

+0

非常感謝大家。 awk很棒,你的幫助也是如此。 – user1956368

+0

+1純粹的bash解決方案! – TrueY

0

使用SED:

sed -n '/^Node/N;/Time/N;s/^Node:\([^\n]*\)\n[^\n]*\n[^ ]* /\1 /p' input 
0
perl -F: -lane '$x=$F[1] if(/^Node:/);if(/^INFO:/){print "$x".$F[1];}' your_file 

以下測試:

> cat temp 
Node:xyz 
Time:01/07/13 14:26:17 
INFO: Trusted certif ok 

Node:abc 
Time:01/07/13 14:26:18 
INFO: Trusted certif ok 

Node:def 
Time:01/07/13 14:26:18 
INFO: Trusted certif not ok 

> perl -F: -lane '$x=$F[1] if(/^Node:/);if(/^INFO:/){print "$x".$F[1];}' temp 
xyz Trusted certif ok 
abc Trusted certif ok 
def Trusted certif not ok 
0
sed -n 'N;N;s/\n.*\n/ /;s/\S*://g;p;n' file