我想用bash来grep,如果有任何进程正在监听端口80,但是现在我偶然发现了令我烦恼的其他端口号。 我怎样才能过滤这个grep?
netstat -ant|grep LISTEN|grep 80|wc -l
还输出其他logging,如8080 8088等。
如何在shell脚本中parsingjson响应?
Bash:通过文件循环读取子string作为参数,执行多个实例
无法在shell脚本中执行cp -u
使用`date`命令获取之前,当前和下个月
我正在看我的netstat命令的输出,看到这个:
tcp4 0 0 10.0.1.10.56941 64.34.119.101.80 ESTABLISHED tcp4 0 0 10.0.1.10.56936 64.34.119.101.80 ESTABLISHED tcp4 0 0 10.0.1.10.56932 64.34.119.101.80 ESTABLISHED tcp4 0 0 10.0.1.10.56929 64.34.119.101.80 ESTABLISHED tcp4 0 0 10.0.1.10.56922 64.34.119.101.80 ESTABLISHED tcp4 0 0 10.0.1.10.56914 64.34.119.101.80 ESTABLISHED tcp4 0 0 *.* *.* CLOSED tcp46 0 0 *.80 *.* LISTEN tcp4 0 0 127.0.0.1.49153 *.* LISTEN tcp4 0 0 127.0.0.1.49152 *.* LISTEN tcp4 0 0 *.631 *.* LISTEN tcp6 0 0 *.631 *.* LISTEN
grep ".80 "
将只接80港. 说拿起这个时期。 (通常这个时间段是指正则表达式中的任何字符 )。 而且,通过在80之后放置一个空格,你可以保证你不会拿起8080端口。实际上,你可以保证你不会拿起.80 IP地址。
实际上,我建议使用awk而不是grep 。 用awk ,你可以指定字段并做更多的处理:
$ netstat -ant | awk '$6 == "LISTEN" && $4 ~ /.80$/' | wc -l
随着awk每列自动成为一个单独的领域。 现场#6($ 6 awk)是说, ESTABLISHED , CLOSED , LISTEN其中。 $4字段是第一列IP地址之一。
在上面,我正在寻找在第六个字段中具有单词LISTEN的行,并且字段#4匹配正则表达式.80$ 。 $是字符串末尾的一个锚点,而.是一个锚点. 正在拿起一个小数点,而不是代表任何字符。 awk命令自动打印出每一行匹配,所以我不必指定。
Awk实际上是一种编程语言。 它假设文件中每行的读循环。 您可以在读取文件之前执行BEGIN子句,并在读取文件之后执行END子句。 各个领域被编号和代表美元符号。 特殊的$0变量代表整个行。 像NF这样的特殊变量给你一行中的字段数量,NR给你读入的行数。还有一整套函数来帮助解析文本等等。下面是awk脚本的完整版本:基本上为你排列了所有的东西,并自行计数,所以你不必管道到wc -l
$ netstat -ant | awk ' BEGIN {total = 0} END {print "There are " total " lines I found"} { if ($6 == "LISTEN" && $4 ~ /.80$/) { total = total + 1 } }'
附加物
OP得到以下输出:
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN
在这种情况下,请尝试:
$ netstat -ant | awk '$6 == "LISTEN" && $4 ~ /:80$/' | wc -l
那里的. 被替换为:或…
$ netstat -ant | awk '$6 == "LISTEN" && $4 ~ /[.:]80$/' | wc -l
无论是冒号还是句号,它都会使用[.:] 。 哎呀,还不如去一路…
$ netstat -ant | awk '$6 == "LISTEN" && $4 ~ /[^0-9]80$/' | wc -l
[^0-9]表示不是数字字符。 你不能出错。 这样,无论是句号,冒号,分号,逗号,还是其他版本的netstat使用的分隔符,都可以工作。
而不是grep netstat的输出 – 要求更多的信息比你需要,然后放弃它的大部分 – 只要问fuser哪个进程有你关心的端口打开:
$ fuser -n tcp 4005 4005/tcp: 19339
如果您只关心是否有任何进程已打开端口,则可以更快,更有效地执行此操作,而无需处理任何输出,方法是使用-q参数进行热熔和退出状态的操作:
if fuser -q -n tcp 4005 ; then echo "port is in use" else echo "port not in use" fi
如果您想知道远程端口有多少个连接,fuser也可以这样做:
fuser -n tcp,80
…或连接到特定主机上的远程端口:
fuser -n tcp,1.2.3.4,80
简而言之 – 使用正确的工具查询您想要的参数直接防止您需要首先进行基于文本的过滤。
使用grep ":80 "代替grep 80
你可以利用端口前面冒号的事实(比如:80 )。 那么禁食的事情会是这样的:
netstat -ant | grep ':80b.*LISTEN'
这样你就不会两次调用grep 。 另外,grep有能力用-c来计算匹配,所以你可以使用它来代替wc :
netstat -ant | grep -c ':80b.*LISTEN'
如果你希望它更健壮,你可以做
netstat -ant |egrep "^tcp +[[:digit:]]+ +[[:digit:]]+ +[[:digit:].]+:80 +.*LISTEN *$"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。