根据需要从包含由pecial字符分隔的字段的文件中提取信息

时间:2014-10-09 17:54:24

标签: shell awk extract

请,我有一个日志文件" log1.txt"包含由字符" |"分隔的字段我想根据具体要求检索行 我有另一个配置文件" code.conf"或者我把字段中的值放在5中。 这是日志文件:

+++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++

abc|2|  11|   3| 1000|   0|scql|  29|   |   |   0|   0| plk| stv| 2| 0

trc|2|  20|   3| 1200|   0|tkgl|   0| pajd|jahd| 0| 0| klm|fdkl|1|0

klm|2|  0|   3| 1300|   0|mlpo|  0|   |   |   0|   0| qnhd| pkjs| 2| 0

klm|2|  0|   3| 1600|   0|mlpo|  22|   |   |   0|   0| qnhd| pkjs| 2| 0

+++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++

这是配置文件" code.conf"

+++++++++++++++++++++++++++++++++++++++++++++++ ++++++

1000

1300

1200

+++++++++++++++++++++++++++++++++++++++++++++++ ++++++

现在我想从日志文件中检索对应于这个条件的行:

字段2等于" 2"

字段3等于" 0"或" 20"

字段4等于" 3"

字段8等于" 0"

字段5必须包含配置文件中声明的值之一。

这是我尝试做的事情:

#!/bin/sh

cat /home/code.conf | awk '{ print "if (substr($2,1,1)==\""2"\" && substr($3,1,1)==\""0"\" || substr($3,1,2)==\""20"\" && substr($4,1,1)==\""3"\" && substr($8,1,1)==\""0"\" && substr($5,1,"length($5)")==\""$1"\" ) { print $0};"}'> /home/awk-code.awk

sed -i '1i{'  /home/awk-code.awk

echo "}" >> /home/awk-code.awk

awk -f /home/awk-code.awk /home/log1.txt > /home/log2.txt

1 个答案:

答案 0 :(得分:0)

awk命令可以在一个命令中处理所有这些:

awk -F' *\\| *' 'FNR==NR {a[$1];next}
         $2==2 && ($3==0 || $3==20) && $4==3 && $5 in a && $8==0' code.conf file
trc|2|  20|   3| 1200|   0|tkgl|   0| pajd|jahd| 0| 0| klm|fdkl|1|0
klm|2|  0|   3| 1300|   0|mlpo|  0|   |   |   0|   0| qnhd| pkjs| 2| 0