如何编写 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
使用 grep
和 cut
$ grep '^Approved by' input_file | cut -d' ' -f3-4
MPPortal Administrator
要考虑的两个选项:
- 使用'awk'
- 使用 grep 定位条目,sed 过滤不需要的前缀。
使用 awk:
awk ' == "Approved" { print , }' pipeline.log
使用grep/sed
grep 'Approved' pipeline.log | sed -e 's/^Approved by //'
我正在尝试编写 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
使用 grep
和 cut
$ grep '^Approved by' input_file | cut -d' ' -f3-4
MPPortal Administrator
要考虑的两个选项:
- 使用'awk'
- 使用 grep 定位条目,sed 过滤不需要的前缀。
使用 awk:
awk ' == "Approved" { print , }' pipeline.log
使用grep/sed
grep 'Approved' pipeline.log | sed -e 's/^Approved by //'