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
使用grep
和pcre
,可以提取所需的字符串
$ 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 @
用于行并打印每行的第二个和倒数第二个字段值。
第二种解决方案:使用字段分隔符和awk
的match
函数。将 space 和 =
设置为字段分隔符并使用 match
函数获取 OP 所需的值。
awk -F' |=' 'match([=11=],/root@([0-9]+\.){3}[0-9]+/){print ,substr([=11=],RSTART+5,RLENGTH-5)}' Input_file
第三个解决方案(通用解决方案): 在此处添加纯通用解决方案,无论 alias host
和root@...
排成一行,以备不时之需。
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
我想在一行中搜索多个匹配项,然后使用 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
使用grep
和pcre
,可以提取所需的字符串
$ 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 @
用于行并打印每行的第二个和倒数第二个字段值。
第二种解决方案:使用字段分隔符和awk
的match
函数。将 space 和 =
设置为字段分隔符并使用 match
函数获取 OP 所需的值。
awk -F' |=' 'match([=11=],/root@([0-9]+\.){3}[0-9]+/){print ,substr([=11=],RSTART+5,RLENGTH-5)}' Input_file
第三个解决方案(通用解决方案): 在此处添加纯通用解决方案,无论 alias host
和root@...
排成一行,以备不时之需。
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