2012-11-03 50 views
6

我試圖返回多個字符串,即第一次出現,我想請從下面的文字,其中的1259,3009,1589和第一次出現發生了線。需要用grep多個字符串的第一次出現

ADWN 1259 11:00 B23 

ADWN 3009 12:00 B19 

DDWN  723 11:30 B04 

ADWN 1589 14:20 B12 

ADWN 1259 11:10 B23 

DDWN 2534 13:00 B16 

ADWN 3009 11:50 B14 

這給了我所有的比賽:

grep '1259\|3009\|1589' somelog.log 

而這給了我只有第一場比賽

grep -m 1 '1259\|3009\|1589' somelog.log 

我想返回以下內容:

ADWN 1259 11:00 B23 

ADWN 3009 12:00 B19 

ADWN 1589 14:20 B12 

我認爲用req創建一個文件uired值,然後通過文件循環,分別傳遞每個號碼存入grep命令會給我什麼,我尋找,但我還沒有發現這樣的一個例子。有沒有一個簡單的解決方案,是一個循環是處理這個問題的最好方法,或者這個例子已經在其他地方得到了解答?

預先感謝您的想法和suggestions--

克萊德

使用 awk

回答

4

方式一:

awk '!array[$2]++ && $2 ~ /^1259$|^3009$|^1589$/' file.txt 

結果:

ADWN 1259 11:00 B23 
ADWN 3009 12:00 B19 
ADWN 1589 14:20 B12 

編輯:

我真的應該進入的第一個閱讀的整個問題的習慣。我看到你正在考慮創建一個包含你想要找到的第一個值的文件。將這些文件放在一個名爲values.txt的文件中,每行一個值。例如;這裏有values.txt內容:

1259 
3009 
1589 

然後運行這個命令:

awk 'FNR==NR { array[$0]++; next } $2 in array { print; delete array[$2] }' values.txt file.txt 

結果:

ADWN 1259 11:00 B23 
ADWN 3009 12:00 B19 
ADWN 1589 14:20 B12 

第一個命令解釋:

如果第二列($2)等於列出的三個值中的一個,把它添加到陣列,如果它不是已經在那裏。 awk默認打印整行。

第二命令解釋:

FNR是相對於當前輸入文件記錄號碼。
NR是記錄的總數。

FNR==NR { ... }構造僅第一個輸入的文件真實。因此,對於values.txt中的每一行,我們將整行($0)添加到數組(我稱它爲數組,但可以給它另一個名稱)。 next強制awk讀取values.txt中的下一行(並跳過處理該命令的其餘部分)。當FNR==NR不再爲真時,讀取參數列表中的第二個文件。然後我們檢查數組中的第二列($2),如果它在那裏,打印並從陣列中刪除它。通過使用delete我們基本上將最大計數設置爲1。

+0

史蒂夫 - 謝謝,那正在做我所問的,它是返回每個值的第一次出現。我有一些關於awk的閱讀,並且明確瞭解代碼的作用 –

+1

如果您願意,我可以添加一個快速解釋。掛在那裏... – Steve

+0

不錯,我很欣賞這個解釋 - 有些東西可能很不透明!我一定能夠把這個好用,再次感謝! –

-1

試試這個。可能無法正常工作取決於您的grep版本:

grep -m 1 -e pattern1 -e pattern2 
+0

謝謝,不幸的是,這段代碼只返回了第一個模式,謝謝。 –

0

這人會每個模式也工作。

for i in $(cut -d " " -f1 somelog.log | sort -u); do LC_ALL=C fgrep -m1 "$i" somelog.log; done 
相關問題