我想获得匹配模式后出现的字符串并排除其他所有内容。比如说,
Nov 17 21:52:06 web01-san roundcube: <he1v330n> User dxxssjksdfd [121.177.26.200]; \
Message for undisclosed-recipients:, stanpiatt@yahoo.com
Nov 17 21:48:26 web01-san roundcube: <fqu8k29l> User cxcnjdfdssd [121.177.26.200]; \
Message for undisclosed-recipients:, stanpiatt@yahoo.com
所以我想在模式User
之后获得 ONLY 字符串并排除其他所有内容,因此输出应为
User dxxssjksdfd
User cxcnjdfdssd
我已经尝试grep -Po 'User\K[^\s]*'
,但它没有给出我想要的东西。我怎样才能做到这一点 ?
答案 0 :(得分:2)
解决方案1:
关注awk
应该会帮助你。
awk -v RS=" " '/User/{getline;print "User",$0}' Input_file
输出如下。
User dxxssjksdfd
User cxcnjdfdssd
解决方案第二: 您也可以通过浏览行的字段来使用以下内容。
awk '{for(i=1;i<=NF;i++){if($i ~ /User/){print $i,$(i+1)}}}' Input_file
解决方案3: 在此处使用sub
awk
实用程序。
awk 'sub(/.*User/,""){print "User",$1}' Input_file
答案 1 :(得分:1)
$ cat infile
Nov 17 21:52:06 web01-san roundcube: <he1v330n> User dxxssjksdfd [121.177.26.200]; \
Message for undisclosed-recipients:, stanpiatt@yahoo.com
Nov 17 21:48:26 web01-san roundcube: <fqu8k29l> User cxcnjdfdssd [121.177.26.200]; \
Message for undisclosed-recipients:, stanpiatt@yahoo.com
使用grep
$ grep -Po 'User [^\s]*' infile
User dxxssjksdfd
User cxcnjdfdssd
使用awk
$ awk 'match($0,/User [^ ]*/){ print substr($0, RSTART,RLENGTH)}' infile
User dxxssjksdfd
User cxcnjdfdssd
使用 GNU awk
$ awk 'match($0,/User [^ ]*/,arr){ print arr[0]}' infile
User dxxssjksdfd
User cxcnjdfdssd
<强>解释强>
/User [^\s]*/
User
匹配字符用户字面(区分大小写)[^\s]*
*
量词 - 在零和无限次之间匹配,尽可能多次,根据需要回馈(贪婪)\s
匹配任何空格字符(等于[\r\n\t\f\v ]
)