用awk固定单词后提取单词

时间:2012-12-27 07:28:32

标签: linux awk

我有一个包含很长行的文件file.txt

1|34|2012.12.01 00:08:35|12|4|921-*203-0000000000-962797807950|mar0101|0|00000106829DAE7F3FAB187550B920530C00|0|0|4000018001000002||962797807950|||||-1|||||-1||-1|0||||0||||||-1|-1|||-1|0|-1|-1|-1|2012.12.01 00:08:35|1|0||-1|1|||||||||||||0|0|||472|0|12|-2147483648|-2147483648|-2147483648|-2147483648|||||||||||||||||||||||||0|||0||1|6|252|tid{111211344662580792}pfid{10}gob{1}rid{globitel} afid{}uid1{962797807950}aid1{1}ar1{100}uid2{globitel}aid2{-1}pid{1234}pur{!GDRC RESERVE AMOUNT 10000}ratinf{}rec{0}rots{0}tda{}mid{}exd{0}reqa{100}ctr{StaffLine}ftksn{JMT}ftksr{0001}ftktp{PayCall Ticket}||

我想在" ctr"之后只打印这个词。在这个文件中,是" StaffLine", 而且我不知道这个词中有多少个字符。

我试过了:

awk '{comp[substr("ctr",0)]{print}}'

但它没有用。我该如何掌握这个词?

4 个答案:

答案 0 :(得分:2)

这是使用awk的一种方式:

awk -F "[{}]" '{ for(i=1;i<=NF;i++) if ($i == "ctr") print $(i+1) }' file

或者,如果您的grep版本支持类似Perl的正则表达式:

grep -oP "(?<=ctr{)[^}]+" file

结果:

StaffLine

答案 1 :(得分:1)

使用sed:

sed 's/.*}ctr{\([^}]*\).*/\1/' input

答案 2 :(得分:1)

处理它的一种方法是sed

sed -e 's/.*}ctr{//; s/}.*//' file.txt

这会删除{ctr之后的所有内容(避免将ctr作为后缀的任何单词出现问题,例如假设的pxctr{Bogus}条目);然后,它会从第一个剩余的}开始删除任何内容,只留下StaffLine样本数据。

答案 3 :(得分:0)

perl -lne '$_=m/.*ctr{([^}]*)}.*/;print $1' your_file

测试如下:

> cat temp
1|34|2012.12.01 00:08:35|12|4|921-*203-0000000000-962797807950|mar0101|0|00000106829DAE7F3FAB187550B920530C00|0|0|4000018001000002||962797807950|||||-1|||||-1||-1|0||||0||||||-1|-1|||-1|0|-1|-1|-1|2012.12.01 00:08:35|1|0||-1|1|||||||||||||0|0|||472|0|12|-2147483648|-2147483648|-2147483648|-2147483648|||||||||||||||||||||||||0|||0||1|6|252|tid{111211344662580792}pfid{10}gob{1}rid{globitel} afid{}uid1{962797807950}aid1{1}ar1{100}uid2{globitel}aid2{-1}pid{1234}pur{!GDRC RESERVE AMOUNT 10000}ratinf{}rec{0}rots{0}tda{}mid{}exd{0}reqa{100}ctr{StaffLine}ftksn{JMT}ftksr{0001}ftktp{PayCall Ticket}||
> perl -lne '$_=m/.*ctr{([^}]*)}.*/;print $1' temp
StaffLine
>