grep一个特定的字符串并用sed替换该文件

时间:2016-09-21 04:10:48

标签: bash sed grep

我需要一些解决方案来替换一些字符串。 我有一个"文件"有了这个内容:

  

23674,ICMP ping,OK,1,1008-08-25 17:11:02
  23686,Ping,OK,1,1008-08-25 16:05:04
  23689,​​SSH Service,OK,1,1008-08-25 16:05:49
  23693,系统自由空间,OK,97.9560,2016-08-25 16:06:49
  23713,System Free Space,OK,88.0078,2016-09-20 18:02:22
  23745,C:\ Free,OK,63.2227,2016-09-21 10:57:03

我使用此代码来获取" Free"像这样的价值:

 grep Free file.txt |grep OK | cut -d K -f 2 |cut -d , -f 2 |cut -d . -f 1

然后我得到了这个结果:

  

97
  88个
  63个

我需要插入"%"使用此代码进入结果:

 grep Free rs.txt |grep OK | cut -d K -f 2 |cut -d , -f 2 |cut -d . -f 1 |sed 's/$/%/g'

结果如下:

  

97%
  88%
  63%

我的问题是,如何替换文件上的值,例如" 97.9560"新结果" 97%"等
请给我一个建议。 感谢

3 个答案:

答案 0 :(得分:2)

要替换文件中的值:

sed -E -i.bak 's/(Free.*OK,[^.]*)[.][^,]*/\1%/' file.txt

示例:

$ sed -E -i.bak 's/(Free.*OK,[^.]*)[.][^,]*/\1%/' file.txt
$ cat file.txt
23674, ICMP ping, OK, 1, 2016-08-25 17:11:02
23686, Ping, OK, 1, 2016-08-25 16:05:04
23689, SSH Service, OK, 1, 2016-08-25 16:05:49
23693, System Free Space, OK, 97%, 2016-08-25 16:06:49
23713, System Free Space, OK, 88%, 2016-09-20 18:02:22
23745, C:\ Free, OK, 63%, 2016-09-21 10:57:03

如何运作

  • -E

    这告诉sed使用扩展正则表达式。这减少了我们需要的反斜杠数量。

  • -i.bak

    这表示要就地更改文件,留下备份文件。

  • s/(Free.*OK,[^.]*)[.][^,]*/\1%/

    这告诉sed进行你需要的替换。在这种情况下,sed会查找与正则表达式(Free.*OK,[^.]*)[.][^,]*匹配的文本。这与Free后跟OK,匹配,后跟除句点之外的任何内容,后跟句点,后跟除逗号之外的任何内容。括号将导致从Free到要在组1中保存的句点之前的最后一个字符的所有内容。

    匹配的文字由\1%替换,这意味着属于第1组的文字\1,后跟百分号,%

答案 1 :(得分:1)

以下是awk版解决方案:

awk -v OFS=, -F, '/Free.*OK/ {split($4,a,"."); $4=a[1]"%"}1' infile
23674, ICMP ping, OK, 1, 2016-08-25 17:11:02
23686, Ping, OK, 1, 2016-08-25 16:05:04
23689, SSH Service, OK, 1, 2016-08-25 16:05:49
23693, System Free Space, OK, 97%, 2016-08-25 16:06:49
23713, System Free Space, OK, 88%, 2016-09-20 18:02:22
23745, C:\ Free, OK, 63%, 2016-09-21 10:57:03

说明:

awk命令仅对包含Free后跟OK的行执行操作。由于此文件是csv文件,请获取第4个字段并拆分为由.分隔的两个部分。在向其附加%符号后打印感兴趣的部分。

sed最适合查找和替换任务,因为它支持就地替换。但是,可以通过awk使用以下方式实现:

awk -v OFS=, -F, '/Free.*OK/ {split($4,a,"."); $4=a[1]"%"}1' infile > infile.tmp && mv infile.tmp infile

答案 2 :(得分:0)

一对perl解决方案

$ perl -pe 's/OK,\s*\d+\K\.\d+/%/ if /Free/' ip.txt
23674, ICMP ping, OK, 1, 2016-08-25 17:11:02
23686, Ping, OK, 1, 2016-08-25 16:05:04
23689, SSH Service, OK, 1, 2016-08-25 16:05:49
23693, System Free Space, OK, 97%, 2016-08-25 16:06:49
23713, System Free Space, OK, 88%, 2016-09-20 18:02:22
23745, C:\ Free, OK, 63%, 2016-09-21 10:57:03
  • OK,\s*\d+\K正面看后,OK,后跟零个或多个空格和一个或多个数字
  • \.\d+点后跟一个或多个数字
  • 替换文字为%,仅在输入行包含Free
  • 时应用

另一种方法是在,上拆分输入行并更改第4个字段

perl -F, -le '$F[3] =~ s/\.\d+/%/ if /Free/; print join",", @F' ip.txt 

如果结果符合预期,可以使用

进行更改

perl -i没有备份

带备份的

perl -i.bkp