以下是我的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
我想只提取有(第一列= sa或sd)和第二列等于4010和4011的行。我尝试了以下命令。
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
有人可以建议我哪里出错了。感谢
答案 0 :(得分: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
答案 1 :(得分: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