sed查找文件包含字段_shell脚本抽取文本文件中指定字符串的方法:sed+grep方法、awk+grep方法(必要时可以联合sed以及grep)、grep+cut方法...

在linux中经常要对一些动态的文本文件抽取指定的字符串,比如执行ps命令后想要获取指定的运行进程(如ps自己)的PID号(同一个进程每次启动的时候pid号是随机分配的)。该怎么办呢?当然,可以用一些截取字符串的方法,这里介绍一下用2种方法来解决这类问题。 一、sed+grep方法: 首先大概了解一下sed,sed是linux里面一个非交互性的文本流编辑器(好长的定义,反正我听起来我很拗口)。解释2点: 1,非交互性:这里非交互性是指sed工具并不直接编辑目的文本文件,而是编辑目的文件的一个缓存拷贝,只能够修改拷贝文件,不会对源文件有任何的改动!也就是说编辑并不在目的文件现场!比如我想要编辑example.log文件,如果用vi编辑器必须直接打开example.log文件,然后在里面编辑。而sed是编辑example.log文件的一个拷贝,那么你可能要问了,这个拷贝在哪儿呢?这个拷贝在缓存里面,不需要我们自己拷贝,只要你调用了sed工具来编辑,系统自动会帮我们拷贝出一个example.log文件供你去编辑,从而保护好源文件不被随意改动。 2,文本流:文本流是指我们通过一定的shell指令对文本进行编辑,而不想vi编辑器一样需要把文件打开之后才能够进行编辑。比如我要删除example.log里面的第一行。vi里面必须先打开文件,然后选中第一行,再按下backspace键删除。如果你使用sed命令的话,就只要执行以下一行代码就可以干脆利落的删除掉第一行:sed '1d' example.log。现在可以知道,sed工具无需打开文件再进行操作,而是通过一系列命令操作文本流,所以叫做文本流编辑器。 好,现在来解决问题: 举个例子,比如使用ipsec的时候经常需要使用的一个命令是setkey -D来查看spi是否正常生成了。而每次ipsec连接的时候产生的spi是不一样的,当spi产生失误的时候,就会出现spi=000000000;现在我想通过一定的shell脚本获取spi的值。setkey -D产生而定输出如下图 我们在说sed,当然使用sed来解决该问题。 明确一下我们的目的:我们的目的是要获取上图中的一段数据:spi=152056446,并且每次如果ipsec重新启动的时候spi后面的数据会不一样(但长度一样,并且都是数字)。那么我们想到自然要用到正则表达式来匹配该段数据,然后输出到一个变量或者文件供我们后续使用。 再来看看sed给我们提供了什么方法:sed可以很方便的把某一行打印出来,sed -n '2p' example.log会打印出第二行。也就是说sed很容易获取行,这显然不能满足我们的需求。sed不会这么简单!sed还提供了删除,追加,插入,替换等丰富的方法来对一段文本进行编辑。 删除某一行: 追加:把hello,i was appended here 追加到有national这一行的的后面。 替换:sed 's/source string/destination string/' example.log 那么,我想既然sed可以非常方便的获取到某一行数据,而它又能够对文本进行编辑,那么,我的想法是,先用sed对文本进行一定的编辑,把目标字符串编辑到某一行内,我就非常方便的获取到了 好,照着这条思路走: 1,编辑文本,把目标字符串放到单独的一行里面来:观察之后可以看出,该段目的字符串spi=152056446(0x0910327e)前后都有空格,那么就用空格作为重新编辑的标记位,前后换行。 输入命令:sed 's/ /\n/g' example.log。解释下命令,s是替换的标记,第一个/ /里面有一个空格,意思是查找所有含有空格的行,最后的g表明要对该行的所有空格进行查询,而不只是查询到第一个就查询下一行,第二个/\n/是一个换行符,结合前面的空格查询语法,可以对所有的空格替换成换行符。里面的命令执行后会把文本重新编排,遇到空格就换行,这样,目标字符串就已经到了单独的一行里面去了!!! 2,获取目标行字符串:现在就很简单了,我们可以用grep来获取(grep "spi" example.log),也可以用sed来获取(sed '/spi/p' example),把屏幕输出重定向到一个文件里面去,或者赋给一个变量,这样,我们抽取目标字符串的任务就完成了!!! 是不是很简单!!!好,下面来看awk方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值