2016-05-23 23 views
1

以下是我test.log中文件基於第二列選擇具體的行值

a 1020 491 513 1 0 0 52 
a 1000 491 513 1 0 0 53 
sa 4011 491 513 1 0 0 0 
sa 4010 491 513 1 0 0 1 
d 1000 508 0 0 0 0 53 
d 1020 508 0 0 0 0 52 
a 1000 508 513 1 0 0 54 
a 1020 508 513 1 0 0 55 
sa 4011 508 1026 2 0 0 2 
sa 4010 508 1026 2 0 0 3 
sd 4010 508 513 1 0 0 1 QIO1 
sa 4021 508 513 1 0 0 1 
d 1000 525 0 0 0 0 54 
d 1020 525 0 0 0 0 55 
sd 4021 525 0 0 0 0 1 QIO2 
a 1000 525 513 1 0 0 57 
a 1020 525 513 1 0 0 56 
sa 4010 525 1026 2 0 0 5 
sa 4011 525 1539 3 0 0 4 
sd 4011 525 1026 2 0 0 0 QIO1 
sa 4021 525 513 1 0 0 0 
d 1000 542 0 0 0 0 57 
sd 4021 542 0 0 0 0 0 QIO2 
d 1020 542 0 0 0 0 56 

我想提取具有等於4010和4011只線(第一列= SA或SD)和第二列我嘗試了下面的命令。

cat test.log | grep "sa\|sd" | awk '{if ($2 = "4010"|| $2 ="4011")print}' 

但它給了我錯誤的輸出。

我的預期輸出是

sa 4011 491 513 1 0 0 0 
sa 4010 491 513 1 0 0 1 
sa 4011 508 1026 2 0 0 2 
sa 4010 508 1026 2 0 0 3 
sd 4010 508 513 1 0 0 1 QIO1 
sa 4010 525 1026 2 0 0 5 
sa 4011 525 1539 3 0 0 4 
sd 4011 525 1026 2 0 0 0 QIO1 

有人建議我要去的地方錯了。由於

回答

3

要地道,我的朋友:

awk '$1 ~ /^s(a|d)$/ && $2 ~ /^401[01]$/' file 
#   ^^^^^^^^^   ^^^^^^^^^ 
#   sa or sd   4010 or 4011 

它返回:

sa 4011 491 513 1 0 0 0 
sa 4010 491 513 1 0 0 1 
sa 4011 508 1026 2 0 0 2 
sa 4010 508 1026 2 0 0 3 
sd 4010 508 513 1 0 0 1 QIO1 
sa 4010 525 1026 2 0 0 5 
sa 4011 525 1539 3 0 0 4 
sd 4011 525 1026 2 0 0 0 QIO1 
+0

謝謝,您的解釋 – user2532296

+0

@ user2532296我希望它很清楚。注意'awk'{if(condition)print}''可以被壓縮到僅僅'awk'條件''。 – fedorqui

+1

爲什麼'(a | d)'而是'[01]'?恕我直言'[廣告]'會更有意義。 –

0

可以在grep的完全做到這一點:

$ grep -E '^s[ad]\s+401[01]' file 
sa 4011 491 513 1 0 0 0 
sa 4010 491 513 1 0 0 1 
sa 4011 508 1026 2 0 0 2 
sa 4010 508 1026 2 0 0 3 
sd 4010 508 513 1 0 0 1 QIO1 
sa 4010 525 1026 2 0 0 5 
sa 4011 525 1539 3 0 0 4 
sd 4011 525 1026 2 0 0 0 QIO1 
相關問題