我有一个包含很长行的文件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}}'
但它没有用。我该如何掌握这个词?
答案 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
>