Awk 仅获取匹配模式后的字符串,并排除所有其他内容

Awk 仅获取匹配模式后的字符串,并排除所有其他内容,awk,sed,grep,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 [1

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

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-Po'User\K[^\s]*'
但它没有给出我想要的。我该怎么做

解决方案一: 下面的
awk
也会对您有所帮助

awk -v RS=" " '/User/{getline;print "User",$0}'   Input_file
输出如下

User dxxssjksdfd
User cxcnjdfdssd
解决方案2:您也可以通过查看行的字段来使用以下内容

awk '{for(i=1;i<=NF;i++){if($i ~ /User/){print $i,$(i+1)}}}'   Input_file
使用
awk

$ awk  'match($0,/User [^ ]*/){ print substr($0, RSTART,RLENGTH)}'  infile
User dxxssjksdfd
User cxcnjdfdssd
$ awk  'match($0,/User [^ ]*/,arr){ print arr[0]}'  infile
User dxxssjksdfd
User cxcnjdfdssd
使用GNU
awk

$ awk  'match($0,/User [^ ]*/){ print substr($0, RSTART,RLENGTH)}'  infile
User dxxssjksdfd
User cxcnjdfdssd
$ awk  'match($0,/User [^ ]*/,arr){ print arr[0]}'  infile
User dxxssjksdfd
User cxcnjdfdssd
说明:

/User[^\s]*/

  • User
    逐字匹配用户字符(区分大小写)
  • 匹配下面列表中不存在的单个字符
    [^\s]*
  • *
    量词-在零次和无限次之间匹配,尽可能多地匹配,根据需要返回(贪婪)
  • \s
    匹配任何空白字符(等于
    [\r\n\t\f\v]

令人惊讶的好解释。
$ awk  'match($0,/User [^ ]*/){ print substr($0, RSTART,RLENGTH)}'  infile
User dxxssjksdfd
User cxcnjdfdssd
$ awk  'match($0,/User [^ ]*/,arr){ print arr[0]}'  infile
User dxxssjksdfd
User cxcnjdfdssd