Shell 根据条件从文件中提取信息

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|

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
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中的条件,这就是区别所在。