shell 如何使用awk、sed或grep来grep第一个匹配和第二个匹配(忽略第一个匹配)?

tuwxkamq  于 2022-11-25  发布在  Shell
关注(0)|答案(4)|浏览(255)
> root# ps -ef | grep [j]ava |  awk '{print $2,$9}'                                                             
> 45134 -Dapex=APEC
> 45135 -Dapex=JAAA
> 45136 -Dapex=APEC

我需要把第一个的第一个APEC作为第一个PID,第三行的APEC和第二个PID,最后一个作为第三个PID。
我尝试了awk,但没有预期的结果。

> First_PID =ps -ef | grep [j]ava |  awk '{print $2,$9}'|awk '{if ($0 == "[^0-9]" || $1 == "APEC:") {print $0; exit;}}'

预期结果应如下所示。

> First_PID=45134
> Second_PID=45136
> Third_PID=45135
hc8w905p

hc8w905p1#

使用您展示的示例和尝试,请尝试以下awk代码。在GNU awk中编写和测试。

ps -ef | grep [j]ava | 
awk '
{
  val=$2 OFS $9
  match(val,/([0-9]+) -Dapex=APEC ([0-9]+) -Dapex=JAAA\s([0-9]+)/,arr)
  print "First_PID="arr[1],"Second_PID=",arr[3],"Third_PID=",arr[2]
}
'
wfveoks0

wfveoks02#

不如这样吧:

$ input=("1 APEC" "2 JAAA" "3 APEC")
$ printf '%s\n' "${input[@]}" | grep APEC | sed -n '2p'
3 APEC

说明:

  • input=(...)-数组中的输入数据,用于测试
  • printf '%s\n' "${input[@]}"-打印input数组,每行一个元素
  • grep APEC-仅保留包含APEC的行
  • sed -n-执行sed,但不自动打印
  • sed -n '2p'-只打印第二行
gywdnpxw

gywdnpxw3#

如果你只想让APEC先...

ps -ef |
  awk '/java[ ].* -Dapex=APEC/{print $2" "$9; next; }
       /java[ ]/{non[NR]=$2" "$9}
       END{ for (rec in non) print non[rec] }'

如果可能,请使用数组,而不要使用那些顺序命名的变量。

mapfile -t pids < <( ps -ef | awk '/java[ ].* -Dapex=APEC/{print $2; next; }
 /java[ ]/{non[NR]=$2} END{ for (rec in non) print non[rec] }' )
x7rlezfr

x7rlezfr4#

在读了大家的想法后,我最终得出了一个非常简单的解决方案。
初始PID=$(ps -ef| grep亚太经合组织|grep -v grep| awk '{打印$2}'| Sed -n '1 p')第二个PID=$(ps -ef| grep亚太经合组织|grep -v grep| awk '{打印$2}'|如果您有任何问题,请使用下面的代码:|grep JAAA| grep -v grep| awk '{打印$2}')

相关问题