如何编写 shell 脚本来选择特定单词后的任何单词

How to write shell script to pick any word after specific word

我正在尝试编写 shell 脚本以在 Jenkins Pipeline 日志文件中查找已批准的用户。我在这里放了一部分管道脚本。如何选择 'MPPortal Administrator' 或任何后跟 'Approved by' 单词的用户名?我是 shell 脚本编写的新手,我不知道该怎么做。

Timeout set to expire in 1 hr 30 min
[Pipeline] {
[Pipeline] input
APPROVE?
Proceed or Abort
Approved by MPPortal Administrator
[Pipeline] }
[Pipeline] // timeout
[Pipeline] }
[Pipeline] // timeout
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Library Policy Evaluation)
[Pipeline] 

我试过的

grep Approved pipeline.log

然后输出是

Approved by MPPortal Administrator

预期输出:

MPPortal Administrator

正如当前的答案已经显示的那样,有多种方法可以做到这一点。这里还有几个:

awk 和 sed:搜索行,删除部分使用 sub:

$ awk '/Approved by/{sub(/Approved by */,""); print}' file
$ sed '/Approved by/!d;s/Approved by *//'
$ sed -n '/Approved by/s/Approved by *//'

awk:搜索行,通过重新定义字段删除部分:

$ awk '/Approved by/{=="";[=11=]=[=11=];=;print}' file

这将搜索“批准人”一词。如果这些词出现在该行中,则删除第一个和第二个字段(这些词是“批准人”)。这将在字符串的其余部分之前保留几个 spaces。因此,通过将主记录重新分配给它自己 ([=14=]=[=14=]),我们重新定义了字段。这里仍然有 space,但现在我们可以重新分配 =,这会重写记录并删除 space。 Hacky,但有效。

grep 使用 perl 正则表达式:

$ grep -oP "Approved by\s\K.*" file
$ grep -oP "(?<=Approved by).*" file

在第一部分我们搜索整行,但是使用 \K 我们删除了之前匹配的所有内容(\s 是一个空白) 第二个使用 look-behind 语句。

使用sed

$ sed -n 's/^Approved[^[:upper:]]*\(.*\)//p' input_file
MPPortal Administrator

使用awk

$ awk '=="Approved" {print ,}' input_file
MPPortal Administrator

使用 grepcut

$ grep  '^Approved by' input_file | cut -d' ' -f3-4
MPPortal Administrator

要考虑的两个选项:

  1. 使用'awk'
  2. 使用 grep 定位条目,sed 过滤不需要的前缀。

使用 awk:

awk ' == "Approved" { print ,  }' pipeline.log

使用grep/sed

grep 'Approved' pipeline.log | sed -e 's/^Approved by //'