b请允许,我有一个日志文件“log1.txt”,其中包含以字符“|”分隔的字段我想根据具体要求检索行 我有另一个配置文件“code.conf”或我把字段5中找到的值。 这是日志文件:
+++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++
abc|2| 11| 3| 1000| 13|scql| 0| | | 0| 0| plk| stv| 2| 0
trc|2| 20| 3| 1200| 30|tkgl| 0| pajd|jahd| 0| 0| klm|fdkl|1|0
klm|2| 0| 3| 1300| 19|mlpo| 0| | | 0| 0| qnhd| pkjs| 2| 0
klm|2| 20| 3| 1600| 11|mlpo| 19| | | 0| 0| qnhd| pkjs| 2| 0
+++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++
这是配置文件“code.conf”
+++++++++++++++++++++++++++++++++++++++++++++++ ++++++
1000
1300
1200
1600
+++++++++++++++++++++++++++++++++++++++++++++++ ++++++
现在我想从日志文件中检索对应于这个条件的行:
如果字段2等于“2”且字段4等于“3”且字段5必须包含配置文件中声明的值之一且(字段3不等于“0”或“20”或)或字段8不等于“0”
我试过这个但是效果不正确:
awk -F' *\\| *' 'FNR==NR {a[$1];next} $2==2 && $4==3 && $5 in a && ($3!=0 || $3!=20)|| $8!=0 ' file
输出应为:
abc|2| 11| 3| 1000| 13|scql| 0| | | 0| 0| plk| stv| 2| 0
klm|2| 20| 3| 1600| 11|mlpo| 19| | | 0| 0| qnhd| pkjs| 2| 0
我认为错误来自逻辑
谢谢
答案 0 :(得分:0)
您在awk命令中混淆了&&
和||
。使用此:
awk -F' *\\| *' 'FNR==NR {a[$1];next} $2==2 && $4==3 && $5 in a &&
(($3!=0 && $3!=20) || $8!=0)' code.conf file
abc|2| 11| 3| 1000| 13|scql| 0| | | 0| 0| plk| stv| 2| 0
klm|2| 20| 3| 1600| 11|mlpo| 19| | | 0| 0| qnhd| pkjs| 2| 0
答案 1 :(得分:0)
试试这个:
awk -F' *\\| *' 'FNR==NR {a[$1];next} ($2==2 && $4==3 && $5 in a &&$3 != 20) || $8 != 0)' code.conf test.txt