grep regex 仅在一行上输出多个匹配项

grep regex to output only multiple matches on a single line

我想在一行中搜索多个匹配项,然后使用 grep

只输出匹配的词
alias host='echo -e "Connecting to host   10.10.11.120\n===================";ssh root@10.10.11.120'
alias host1='echo -e "Connecting to host   10.10.11.121\n===================";ssh root@10.10.11.121'
alias host2='echo -e "Connecting to host   10.10.11.122\n===================";ssh root@10.10.11.122'
alias host3='echo -e "Connecting to host   10.10.11.123\n===================";ssh root@10.10.11.123'

我希望 grep 只输出主机名和 IP 地址,如

host 10.10.11.120
host1 10.10.11.121
host2 10.10.11.122
host3 10.10.11.123

grep匹配。它不会修改

尝试 sed:

sed 's/.*ssh root@/host /' 's/'//' myscript.sh

使用greppcre,可以提取所需的字符串

$ grep -oP 'alias \K[^=]+|@\K[0-9.]+' ip.txt 
host
10.10.11.120
host1
10.10.11.121
host2
10.10.11.122
host3
10.10.11.123

但是,每个提取的字符串都会在单独的行中,因此可以使用其他命令来连接它们,例如:

$ grep -oP 'alias \K[^=]+|@\K[0-9.]+' ip.txt | paste - -
host    10.10.11.120
host1   10.10.11.121
host2   10.10.11.122
host3   10.10.11.123


或者,也可以使用单个 perl 命令:

$ perl -pe 's/alias (host\d*).*@([\d.]+).*/ /' ip.txt 
host 10.10.11.120
host1 10.10.11.121
host2 10.10.11.122
host3 10.10.11.123
$ grep -oP 'alias \K[^=]+|@\K[0-9.]+' ip.txt | paste - -
host    10.10.11.120
host1   10.10.11.121
host2   10.10.11.122
host3   10.10.11.123

太棒了!

第一个解决方案: 使用 awk 可能会简单得多,使用您显示的示例,请尝试以下操作 awk代码。

awk -F" |=|'|@" '{print ,$(NF-1)}' Input_file

解释: 简单的解释就是,设置不同的字段分隔符,例如:space,= OR @ 用于行并打印每行的第二个和倒数第二个字段值。



第二种解决方案:使用字段分隔符和awkmatch函数。将 space 和 = 设置为字段分隔符并使用 match 函数获取 OP 所需的值。

awk -F' |=' 'match([=11=],/root@([0-9]+\.){3}[0-9]+/){print ,substr([=11=],RSTART+5,RLENGTH-5)}' Input_file


第三个解决方案(通用解决方案): 在此处添加纯通用解决方案,无论 alias hostroot@... 排成一行,以备不时之需。

awk '
match([=12=],/alias host[^=]*/){
  firstVal=substr([=12=],RSTART+6,RLENGTH-6)
  match([=12=],/root@([0-9]+\.){3}[0-9]+/)
  print firstVal,substr([=12=],RSTART+5,RLENGTH-5)
}
'  Input_file