匹配模式后只获取字符串并排除其他所有内容

时间:2017-11-17 11:07:07

标签: awk sed grep

我想获得匹配模式后出现的字符串并排除其他所有内容。比如说,

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]*',但它没有给出我想要的东西。我怎样才能做到这一点 ?

2 个答案:

答案 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 ]