Awk 摆脱与linux匹配的行尾模式
我试图从配置中获取ip地址列表,并以以下格式接收它们:Awk 摆脱与linux匹配的行尾模式,awk,sed,Awk,Sed,我试图从配置中获取ip地址列表,并以以下格式接收它们:*.*.*.*.*,其中最后一个字段是已建立连接的端口号。 我怎样才能摆脱努梅伯港? 以下是我现在的路线: ss -ta | tail -n +2 |awk '{print $4}' | sort -u 我知道我需要使用sed作为awk和sort之间的管道来移除冒号后的部分,但我不确定如何正确地进行 行ss-ta 返回以下内容: State Recv-Q Send-Q Local Address:Port
*.*.*.*.*
,其中最后一个字段是已建立连接的端口号。
我怎样才能摆脱努梅伯港?
以下是我现在的路线:
ss -ta | tail -n +2 |awk '{print $4}' | sort -u
我知道我需要使用sed作为awk和sort之间的管道来移除冒号后的部分,但我不确定如何正确地进行
行ss-ta
返回以下内容:
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:ssh *:*
LISTEN 0 100 127.0.0.1:smtp *:*
CLOSE-WAIT 32 0 192.168.1.7:48474 104.18.35.72:https
CLOSE-WAIT 32 0 192.168.1.7:52879 104.18.34.72:https
CLOSE-WAIT 1 0 192.168.1.7:38492 82.80.211.109:http
LISTEN 0 128 :::ssh :::*
LISTEN 0 100 ::1:smtp :::*
ESTAB 0 52 fe80::a00:27ff:fead:6df2%enp0s3:ssh fe80::e1
这是我的命令的输出:
> 127.0.0.1:smtp
> 192.168.1.7:38492
> 192.168.1.7:48474
> 192.168.1.7:52879
> ::1:smtp
> fe80::a00:27ff:fead:6df2%enp0s3:ssh
> :::ssh
> *:ssh
所需输出为:
> 127.0.0.1
> 192.168.1.7
谢谢只需使用正则表达式删除
:
之后的所有内容,您可以使用:
ss -ta | tail -n +2 |awk '{print $4}' | sort -u | sed 's/:.*$//g' | uniq
或者您甚至可以使用awk
和:
作为字段分隔符:
ss -ta | tail -n +2 |awk '{print $4}' | sort -u | awk -F : '{print $1}' | uniq
或使用delimeter切割,如:
ss -ta | tail -n +2 |awk '{print $4}' | sort -u | cut -d : -f 1 | uniq
只需使用正则表达式删除
:
之后的所有内容,即可使用:
ss -ta | tail -n +2 |awk '{print $4}' | sort -u | sed 's/:.*$//g' | uniq
或者您甚至可以使用awk
和:
作为字段分隔符:
ss -ta | tail -n +2 |awk '{print $4}' | sort -u | awk -F : '{print $1}' | uniq
或使用delimeter切割,如:
ss -ta | tail -n +2 |awk '{print $4}' | sort -u | cut -d : -f 1 | uniq
您可以使用gnu awk执行端口删除,在原始管道中使用
awk'{print gensub(/:.*/,“”,“g”,“$4)}
。您可以使用gnu awk执行端口删除,使用awk'{print gensub(/:.*/,“”,“g”,“$4)}“
在原始管道中。如果没有可测试的样本输入和预期输出,这有点像猜测,但听起来您需要的只是
ss -ta | awk '{$0=$4;sub(/:[^:]+$/,"")} NR>1 && !seen[$0]++'
e、 g.使用cat文件
而不是ss ta
将预期输入传输到命令:
$ cat file | awk '{$0=$4;sub(/:[^:]+$/,"")} NR>1 && !seen[$0]++'
*
127.0.0.1
192.168.1.7
::
::1
fe80::a00:27ff:fead:6df2%enp0s3
但如果我们查看您发布的预期输出,那么您真正想要的可能更像:
$ cat file | awk '{$0=$4;sub(/:[^:]+$/,"")} NR>1 && /[0-9]+(\.[0-9]+){3}/ && !seen[$0]++'
127.0.0.1
192.168.1.7
没有可测试的样本输入和预期输出,这有点像猜测,但听起来你需要的只是
ss -ta | awk '{$0=$4;sub(/:[^:]+$/,"")} NR>1 && !seen[$0]++'
e、 g.使用cat文件
而不是ss ta
将预期输入传输到命令:
$ cat file | awk '{$0=$4;sub(/:[^:]+$/,"")} NR>1 && !seen[$0]++'
*
127.0.0.1
192.168.1.7
::
::1
fe80::a00:27ff:fead:6df2%enp0s3
但如果我们查看您发布的预期输出,那么您真正想要的可能更像:
$ cat file | awk '{$0=$4;sub(/:[^:]+$/,"")} NR>1 && /[0-9]+(\.[0-9]+){3}/ && !seen[$0]++'
127.0.0.1
192.168.1.7
提供一个语料库和您想要的输出。提供一个语料库和您想要的输出。++,但为了清晰起见,可以将
“g”
替换为1
。并提及由于gensub()的原因,它是特定于gawk(和mawk?)的,并将regexp更改为:[^::*$
,以从最后一个:
删除到最后一个,而不是从第一个,但是为了清楚起见,也许可以将“g”
替换为1
,并提及由于gensub()的原因,它是特定于gawk(和mawk?)的,并将regexp更改为:[^::::*$
以从最后一个:
删除到最后一个:
。