免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2750 | 回复: 2
打印 上一主题 下一主题

[文本处理] 挑战! 如何取出想要的数字(使用awk或者sed) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-12-17 22:19 |只看该作者 |倒序浏览
有这么个实际需要。
在tcpdump的抓包输出中,需要取出端口号,
因为tcpdump的输出一般为
*********(若干字符)****** 192.168.1.1.5800 --> 192.168.1.25.6500 *********(若干字符)*******
现在想取出端口号5800, 其中192.168.1.1.5800是整个一行输出的第18个field(用空格作为分隔符的话)

本来的想法是这样:
tcpdump -l -nn -vvv host 192.168.1.25 |  awk '{print $18}'
这样可以取出 192.168.1.1.5800
这串字符,然后又想对于这串字符取出5800,想到用 awk -F '.' '{print $NF}'来取出来,但是发现
tcpdump -l -nn -vvv host 192.168.1.25 |  awk '{print $18}' | awk -F '.' '{print $NF}'
这个竟然没有输出,难道是两个awk不能连起来使用?
换成cut也不行。

大家有好的办法么?谢谢了!

论坛徽章:
7
亥猪
日期:2013-10-10 17:00:29辰龙
日期:2013-10-12 16:23:19卯兔
日期:2013-11-18 17:01:27金牛座
日期:2014-09-09 10:17:052015七夕节徽章
日期:2015-08-21 11:06:172015亚冠之柏太阳神
日期:2015-09-25 13:56:42数据库技术版块每日发帖之星
日期:2016-08-06 06:20:00
2 [报告]
发表于 2013-12-17 22:37 |只看该作者
  1. -F '.'
复制代码
F后面有个空格!把空格去掉试下
直接换成这样
  1. awk '{l=split($18,a,".");print a[l]}'
复制代码

论坛徽章:
0
3 [报告]
发表于 2013-12-17 22:52 |只看该作者
本帖最后由 zhangqingsup 于 2013-12-17 22:56 编辑

回复 2# li0924

你好!我刚刚也是想到了这样的解决方法,还是要谢谢你。但是我发现如下的问题:

tcpdump -l -nn -vvv host 192.168.1.105 | awk '{split($1,a,"."); print a[5]}' | xargs -n1 -I {} lsof -i:{}
我是用上面的这句语句来获取OS中占用某个端口的进程,但是发现
tcpdump -l -nn -vvv host 192.168.1.105 | awk '{split($1,a,"."); print a[5]}'  虽然可以打印出来我要的端口号,但是再用管道却无法把输出传递到后面的xargs -n1 -I {} lsof -i:{}。

但是,如果我使用
echo "192.168.1.5.22" | awk '{split($1,a,"."); print a[5]}' | xargs -n1 -I {} lsof -i:{}
则可以将awk的结果输出到xargs。

似乎tcpdump输出的流没有传递性。
也就是说tcpdump是个连续的输出(不停的抓包),而awk可以持续过滤tcpdump的输出,但是再跟上一个管道后,输出就没有办法再传给别的函数或者命令解析,不知道各位知道有想法么?

      //我是在2.6.32.9-70.fc12.i686上运行的tcpdump,不同版本Linux或者Unix版本的tcpdump输出可能不一样。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP