我试图从ss
命令输出中使用bash正则表达式来提取在函数中使用给定端口的应用程序的名称。我对正则表达式有一些问题。
查看数据是否为ss -tupln
要解析的数据示例(ipv4):
tcp LISTEN 0 10 0.0.0.0:80 0.0.0.0:* users:(("nc",pid=3474,fd=4))
tcp LISTEN 0 10 [::]:80 [::]:* users:(("nc",pid=3474,fd=3))
在本例中,我想提取nc
,这是使用端口
的程序名称要解析的数据示例(ipv6):
tcp LISTEN 0 511 *:80 *:* users:(("apache2",pid=6741,fd=4),("apache2",pid=6740,fd=4),("apache2",pid=6738,fd=4),("apache2",pid=6737,fd=4),("apache2",pid=6736,fd=4),("apache2",pid=6724,fd=4))
在本例中,我想提取apache2
,这是使用端口的程序的名称。
我需要一个对这两种情况都有效的通用正则表达式。我不在乎它是使用grep还是使用纯bash正则表达式完成的。我的非工作方法:
#!/bin/bash
get_name() {
local regexp="${1}.*[0-9*]:${2}[[:blank:]]+.*[[:blank:]]+users:(("(.+)","
[[ $(ss -tupln) =~ ${regexp} ]] && process_name="${BASH_REMATCH[1]}"
echo "${process_name}"
}
get_name "tcp" "80"
谢谢。
您可以使用gnu grep:
ss -tupln | grep -oP 'tcph.*?:80h.*?busers:(("K[^"]+(?=")'
模式匹配:
tcph
匹配tcp和空格.*?:80h
匹配尽可能少的字符,然后是:80
和空格.*?busers:
尽可能少匹配字符,然后users:
(("
匹配(("
K[^"]+
忘记匹配到far的内容(它不会成为结果匹配的一部分)(?=")
正向前看,断言=
直接向右
查看正则表达式演示
你可以这样使用awk
:
$ ss -tupln | awk -v proto=tcp -v port=80 '$1 == proto && $5 ~ ":" port "$" {split($0, array, """); print array[2]}'
apache2