linux如何截取指定字符串行前后N行的数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux如何截取指定字符串行前后N行的数据相关的知识,希望对你有一定的参考价值。

有如下数据,是显示系统连接信息的字符串,现在要统计每个ip的链接字节数,例如,截取所有src=192.168.1.5,的字节数,并相加。

我的思路是:先grep找到"192.168.1.5"往下数2行,截取其数字部分,并循环依次相加,但这shell代码怎么写?

注意,是用shell写,C语言我会

1 table: 0x767160
layer3 ipv4
type 8
layer4 icmp
code 0
id 19
src 192.168.1.5
packets 34123
bytes 2047380
dst 218.16.118.54
2 table: 0x767750
bytes 62
src 192.168.1.5
sport 54675
layer4 udp
dst 192.168.1.1
dport 53
layer3 ipv4
packets 1

…………………………
补充:字符串里面有很多个ip的信息,我只需要一个。不能简单匹配 所有bytes行

你第二个表项192.168.1.5往下数两行并不是字节数呀。追问

有道理,icmp和其他协议的显示格式不同,能不能这样:
根据table为标识符,分割字符串,若在每段中出现"src+任意空格+192.168.1.5",就查找当前分段里的bytes后面的数字

追答

试了一下,这个可以:

$ gawk -v RS='table:'  '/src\\s+192.168.1.5/num+=gensub(/.*bytes\\s+([0-9]+).*/,"\\\\1","a") ENDprint num' 1.txt


结果2047442


参考技术A cat data.txt|awk  'BEGINsum=0if(/192\\.168\\.1\\.5/)getline;getline;match($0,/bytes[^0-9]*?([0-9]*).*/,r);if(r[1])sum=sum + r[1]ENDprint sum'

追问

192.168.1.5可能出现在src和dst,只需要找,匹配src+任意个空格+192.168.1.5,怎么改?

追答

src[^0-9]*192\.168\.1\.5

追问

你试过了么?不行啊,按照我上面的数据和你的代码,应该能打印出2047380,结果是0

楼下提醒了,发现icmp和其他协议的显示格式不同,能不能这样:
根据table为标识符,分割字符串,若在每段中出现"src+任意空格+192.168.1.5",就查找当前分段里的bytes后面的数字,并统计相加

追答

不需要改,首先找到 匹配src+任意个空格+192.168.1.5 ,然后找 往下数2行,

如何下数2行里面没有 bytes 字符,就不会获取,直接跳过,

继续找下一个,然后找 往下数2行。。。

cat data.txt|awk 'BEGINsum=0if(/src[^0-9]*192\\.168\\.1\\.5/)getline;getline;match($0,/bytes[^0-9]*([0-9]*).*/,r);if(r[1])sum=sum + r[1]ENDprint sum'

Excel怎样从一串字符中的某个指定“字符”前后截取字符及截取字符串常用函数

怎么样可以从一串字符中的某个指定位置的前或后截取指定个数的字符.

如:12345.6789,我要截取小数点前(或后)的3个字符.怎么样操作,

另外,怎么样从右边截取字符,就是和left()函数相反的那个功能.

=find(".",a2)
返回在数字中字符(小数点)的位置。

具体公式如下:
字符(小数点)前三位
=MID(A2,FIND(".",A2)-3,3)

字符(小数点)后三个
=MID(A2,FIND(".",A2)+1,3)

字符(小数点)前面的所有数字

=LEFT(A2,FIND(".",A2)-1)

字符(小数点)后面的所有数字

=RIGHT(A2,FIND(".",A2)-2)

以上均为不包括“字符”的情况。其它情况只需改变一下红色数字大小。

----------------------------------------------------------------------
截取字符串常用函数:

常用函数有:left函数,right函数和mid函数

left函数语法:left(text,num_chars),从左侧开始截取部分字符串

right函数语法:right(text,num_chars),从右侧开始截取部分字符串

其中:text表示要截取的字符串,num_chars表示要截取的字符数

mid函数语法:mid(text,start_num,num_chars),中间某位置开始截取部分字符串

其中:text表示要截取的字符串,start_num表示从第几位字符串开始截取,num_chars表示要截取的字符数。

以上是关于linux如何截取指定字符串行前后N行的数据的主要内容,如果未能解决你的问题,请参考以下文章

js 截取特殊字符前后的所有字符串

mysql中截取指定字符前后的字符串

如何用shell提取文件中指定的字符串

linux 中如何截取2个字符串中间的字符?

sql语句,如何截取指定字段某一个字符出现后的后面的字符串吗

Linux下字符串的截取