2015-10-15 118 views
3

我想在一行中找到兩個字符串。以下是示例行。grep在一行中多個字符串

line1: xxxx yyyy time1-12 zzzz time2-13 
line2: xxxx yyyy time1-14 zzzz time2-15 

我使用的是下面的grep命令來實現這個

grep -o -E 'time1-[0-9]*|time2-[0-9]*' timetest.txt 

這是給我的輸出作爲

time1-12 
time2-13 
time1-14 
time2-15 

但我想這樣

time1-12 time2-13 
time1-14 time2-15 

我在這裏錯過了什麼?我可以去AWK或sed中獲得此輸出

+1

試'的awk「{打印$ 4‘’$ 6}」 timetest.tx t' –

回答

3

隨着GNU AWK的第三個參數匹配():

$ awk 'match($0,/time1-[0-9]*/,a) && match($0,/time2-[0-9]*/,b) { print a[0], b[0] }' file 
time1-12 time2-13 
time1-14 time2-15 

注意時間1和時間2可以按任何順序排隊。與其他awks你需要使用SUBSTR()提取匹配()結果:

$ awk 'match($0,/time1-[0-9]*/) && (a=substr($0,RSTART,RLENGTH)) && match($0,/time2-[0-9]*/) { print a, substr($0,RSTART,RLENGTH) }' file 
time1-12 time2-13 
time1-14 time2-15 

如果2次總是以相同的順序,然後用GAWK你可以這樣做:

$ awk 'match($0,/(time1-[0-9]*).*(time2-[0-9]*)/,a) { print a[1], a[2] }' file 
time1-12 time2-13 
time1-14 time2-15 

但那麼它只是在一個單獨的線,所以你可能也只是使用SED一個簡單的替換:

$ sed -r 's/.*(time1-[0-9]*).*(time2-[0-9]*).*/\1 \2/' file 
time1-12 time2-13 
time1-14 time2-15 
1

Perl來救援:

perl -lne 'print "$1 $2" if /(time1-[0-9]+).*(time2-[0-9]+)/' timetest.txt 

的代碼假定time1來始終time2之前。

1

試試這個sed命令,

sed 's/[^t]\+\(time[^ ]\+\)/\1 /g' FileName 

sed 's/[^t]\+\(time\(1\|2\)[^ ]\+\)/\1 /g' FileName 

輸出:

time1-12 time2-13 
time1-14 time2-15 

Cut版本

cut -d" " -f 4,6 FileName 
+0

這只是打印包含以'time'開頭的字符串的任何行的結尾,它不會查找OP關心的2個特定正則表達式。 –

+0

@EdMorton,我明白了你的觀點,看到我更新的答案...... – Kalanidhi

1

另一種解決方案,使用grep

grep -o -E 'time[0-9]+-[0-9]+' timetest.txt | paste -d " " - - 

你,

 
time1-12 time2-13 
time1-14 time2-15 
+0

這是我的,雖然也是。唯一的困難是:如果每條線上不存在2個匹配,則輸出可以合併來自不同線的匹配。 –

+0

在這種情況下,是更好的Kalanidhi的解決方案....我爲此回答投票 –

+0

它也不會匹配2個目標正則表達式,它將匹配任何時間 .... –

0
awk -vRS="time[12]-[0-9]+" '{$0=RT}1' filename 
time1-12 
time2-13 
time1-14 
time2-15