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

时间:2014-10-10 11:25:33

标签: shell awk sed

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

我认为错误来自逻辑

谢谢

2 个答案:

答案 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