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

Rah*_*hul 3 awk grep sed

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

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
Run Code Online (Sandbox Code Playgroud)

所以我想在模式之后获取字符串User并排除其他所有内容,因此输出应该是

User dxxssjksdfd
User cxcnjdfdssd
Run Code Online (Sandbox Code Playgroud)

我已经尝试过grep -Po 'User\K[^\s]*',但它没有给出我想要的。我怎样才能做到这一点 ?

Aks*_*gde 5

$ cat infile\nNov 17 21:52:06 web01-san roundcube: <he1v330n> User dxxssjksdfd [121.177.26.200]; \\\nMessage for undisclosed-recipients:, stanpiatt@yahoo.com\nNov 17 21:48:26 web01-san roundcube: <fqu8k29l> User cxcnjdfdssd [121.177.26.200]; \\\nMessage for undisclosed-recipients:, stanpiatt@yahoo.com\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用grep

\n\n
$ grep -Po 'User [^\\s]*'  infile\nUser dxxssjksdfd \nUser cxcnjdfdssd \n
Run Code Online (Sandbox Code Playgroud)\n\n

使用awk

\n\n
$ awk  'match($0,/User [^ ]*/){ print substr($0, RSTART,RLENGTH)}'  infile\nUser dxxssjksdfd\nUser cxcnjdfdssd\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用GNU awk

\n\n
$ awk  'match($0,/User [^ ]*/,arr){ print arr[0]}'  infile\nUser dxxssjksdfd\nUser cxcnjdfdssd\n
Run Code Online (Sandbox Code Playgroud)\n\n

解释:

\n\n

/User [^\\s]*/

\n\n
    \n
  • User匹配字符 User 字面意思(区分大小写)
  • \n
  • 匹配下面列表中不存在的单个字符[^\\s]*
  • \n
  • *量词 \xe2\x80\x94 匹配零次到无限次,尽可能多的次数,根据需要回馈(贪婪)
  • \n
  • \\s匹配任何空白字符(等于[\\r\\n\\t\\f\\v ]
  • \n
\n