打印行号,匹配UNIX后匹配行和第n行的前几个字符

时间:2014-04-24 18:59:12

标签: regex unix awk sed unix-timestamp

我正在使用

awk '/^E/ {a=substr($0,1,26);n=NR} NR==n+2 && n {print n,a,$0}' logfile

但我希望将{strong 1>}之后的日期或时间戳作为参数传递给shell脚本(想要获取始终以E开头的行)。假设我将输入作为E给下面的文件(按照下面的输入文件为2行),它应该从2014-04-03开始获取行并匹配日期并显示该输出的所有条目日期

预期输出

E

inputfile如下所示

line number | E 2014-04-03 12:11:41.853 |location=PIN_ERR_FM:5 class=PIN_ERR_APPLICN:4 errno=PIN_ERR_VALUE:46

注意:从E 2014-04-03 12:11:41.853 abm310 cm:21.-142726944 functionalpurchase.c:1821 1:Isa-P funcitional_aply_elmt eror <location=PIN_ERR_FM:5 class=PIN_ERR_APPLICN:4 errno=PIN_ERR_VALUE:46 <field num=PIN__T:8,62 recid=0 reserved=0 reserved2=0 time(sec:usec)=1396548701:> D 2014-04-03 12:11:41.853 abm310 cmf:2.-142726944 funtionalpurchase.c:1767 1:Isa-PC: Now apply the good fee <location=debugstate.c;class not found;errno=not found:01 E 2014-04-03 12:11:41.853 abm310 cm:21.-142726944 functionalpurchase.c:1821 1:Isa-P <location=PIN_ERR_FM:5 class=PIN_ERR_APPLICN:4 errno=PIN_ERR_VALUE:47> <field num=PIN__T:8,62 recid=0 reserved=0 reserved2=0 time(sec:usec)=1396548701:> <facility=0 msg_id=85 version=1> 开始的行也将被提取,有时会在模式匹配后转到第2行或第3行或第4行。

2 个答案:

答案 0 :(得分:1)

这可能适合你(GNU sed):

sed -rn '/^E/{=;N;N;s/^(.{15}).*\n.*\n\s*/\1/p}' file | sed 'N;s/\n/ /'

这将打印所需行的行号,然后读取并追加接下来的两行并返回提取的字符串。输出通过管道连接到另一个sed,它将每两行减少到一行。

答案 1 :(得分:0)

这是你喜欢的吗?

awk '/^E/ {a=$0;n=NR} NR==n+2 && n {print n,a,$0}' file
1 E 45907:000:39   Error type, meant to find solution

这会打印以E开头的行的行号,然后是行,然后是第二行。

更新为从触发线只获得7个字符。

awk'/ ^ E 20 [0-9] [0-9] / {d = $ 1 FS $ 2 FS $ 3; f = 1; n = NR} f&amp;&amp; / location / {$ 1 = $ 1; gsub(/ [&lt;&gt;] /,“”); print n,d,$ 0; f = 0}'OFS = \ | 1 | E 2014-04-03 12:11:41.853 | location = PIN_ERR_FM:5 | class = PIN_ERR_APPLICN:4 | errno = PIN_ERR_VALUE:46 10 | E 2014-04-03 12:11:41.853 | location = PIN_ERR_FM:5 | class = PIN_ERR_APPLICN:4 | errno = PIN_ERR_VALUE:47


从您的新数据我只会打印数据,如果行以E开头(如果您愿意,可以是D):

awk '/^E 20[0-9][0-9]/ {d=$1 FS $2 FS $3;f=1;n=NR} f && /location/ {$1=$1;gsub(/[<>]/,"");print n,d,$0;f=0}' OFS=\| file
1|E 2014-04-03 12:11:41.853|location=PIN_ERR_FM:5|class=PIN_ERR_APPLICN:4|errno=PIN_ERR_VALUE:46
10|E 2014-04-03 12:11:41.853|location=PIN_ERR_FM:5|class=PIN_ERR_APPLICN:4|errno=PIN_ERR_VALUE:47