Shell 根据条件从文件中提取信息
b请注意,我有一个日志文件log1.txt,其中包含由字符分隔的字段|我希望根据特定要求检索行 我有另一个配置文件code.conf,或者我把这些值在第5栏找到的。 以下是日志文件: ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Shell 根据条件从文件中提取信息,shell,awk,sed,Shell,Awk,Sed,b请注意,我有一个日志文件log1.txt,其中包含由字符分隔的字段|我希望根据特定要求检索行 我有另一个配置文件code.conf,或者我把这些值在第5栏找到的。 以下是日志文件: ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ abc|2| 11| 3| 1000| 13|scql| 0| | | 0| 0| plk| stv| 2| 0 trc|
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
1000
1300
1200
1600
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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
1000
1300
1200
1600
这是配置文件code.conf
+++++++++++++++++++++++++++++++++++++++++++++++++++++
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
1000
1300
1200
1600
+++++++++++++++++++++++++++++++++++++++++++++++++++++
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
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
我认为错误来自逻辑
谢谢您在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
试试这个:
awk -F' *\\| *' 'FNR==NR {a[$1];next} ($2==2 && $4==3 && $5 in a &&$3 != 20) || $8 != 0)' code.conf test.txt
当1600不在code.conf中时,它是如何输出的?这只是一个错误,1600存在于code.conf中,我将添加它,但如果$3等于0或20,字段$8不等于0,则情况正确,所以您得到的是预期输出,不是吗?不,因为如果字段3$3等于0或20,字段$8不等于0,则这一行必须为空在输出中显示。在您的问题中为这种情况提供更好的示例,因为此输出与预期输出匹配。顺便说一句,我再次测试了此awk命令,并且此awk命令确实输出一行,其中$3为20,$8为19。再次测试。对于没有经验的用户来说,无法解释的代码块可能很难破译,也无法帮助人们理解解决方案。你能简单地解释一下它的作用,以及它是如何解决问题的吗?请阅读awk中的条件,这就是区别所在。