利用shell脚本批量提取txt文件中任意字段

  • 前言
  • 0. 一个例子
  • 1. cat命令
  • 2. '|'符号与‘>’符号
  • 3. grep命令
  • 4. awk命令

前言

对于测试中出现的log,我们经常需要提取其中的关键信息进行分析,之前我通常使用python的工具来处理一些字符串,但是效率不是很高。现在通过shell脚本的方法会极大的增加效率,一句话就可以在任意的txt文本中提取到我们想要的字段,下面我们来看一下这个神奇的工具。

0. 一个例子

假如我们要从下面这段txt格式的log中提取‘sequence’后面的数据以及‘alpha’后面的数据,我们仅通过一句怎么来实现这个功能呢?

02-11 10:30:56.062  1512  1512 D OplusLayer: setAlpha sequence=6092, alpha=1.000000, name=Surface(name=5213b6f InputMethod)/@0x45bb15a - animation-leash of insets_animation#0
02-11 10:30:56.062  1512  1512 D OplusLayer: setAlpha sequence=6145, alpha=4.000000, name=Surface(name=5213b6f InputMethod)/@0x45bb15a - animation-leash of insets_animation#0
02-11 10:30:56.062  4132  4363 D OplusFastRecovery: network netid not match!! null,103
02-11 10:30:56.063  1512  1512 D OplusMovieIdle: updateLayerStacks,mOmiSupport is not supoort

我们只需要以下命令就可以得到我们想要的数据:

cat old.log | grep "setAlpha" | awk -F: '{ print $4}' | awk -F, '{ print $1"="$2 }' | awk -F= '{ print $2 ","  $4 }'> new.log

这句命令乍一看比较复杂,但是实际上逻辑很简单,我们来一步步解析这条指令是怎么实现的。

1. cat命令

cat old.log

cat命令是常用的shell命令,此处的作用就是打开文件名为“old.log”的文件,并准备进行编辑。这个文件也可以是‘.txt’格式结尾的。

2. '|'符号与‘>’符号

shell命令中,‘|’符号表示的是管道。假设输入了如下指令:command0 | command1,则command0的输出流入到command1中。在我们的指令中,‘|’负责把上一句执行的输出当作输入流入到下一句。
‘>’符号在本文指令中的作用是重定向到文本, cat指令将文本打开,然后通过’|‘符号流入到后续的语句进行处理,处理完之后通过’>'将处理之后的结果存放在指定文本中。

3. grep命令

grep指令常用于搜索文本文件中是否含有某些特定模式的字符串。该命令以行为单位读取文本并使用正则表达式进行匹配,匹配成功后打印出该行文本
grep命令记住两点,第一,它用来匹配文本中的字符串,第二,以行为单位读取,也就是说,如果文本中国一行含有目标字符串,grep就将整行打印出来。我们指令中的grep用法为:

grep "setAlpha"

我们在终端输入命令(需要将终端定位到文件路径下):

cat old.log | grep "setAlpha"

运行结果为:

可以看到,这句命令将含有“setAlpha”字符串的语句成行地打印了出来,对于log中比较多地数据,我们可以将结果保存在新的文件中:

cat old.log | grep "setAlpha" > new.log

运行完毕之后,会出现一个‘new.log’文件,打开我们就可以看到和之前终端显示一样的内容:

4. awk命令

AWK 是一种处理文本文件的语言,处理文本非常方便,熟悉python的同学可以把它当作python中的split()函数,它的作用就是根据指定字符来对文本进行分割并生成列表
举个例子:

cat old.log | grep "setAlpha" | awk -F: '{ print $4}'

这句话的意思就是,awk语句根据前面生成的文本,以‘-F’后面的符号,即‘:’(冒号)为分界点进行分割,然后将分割后的第四个元素打印出来(即‘print $4’),运行结果为:


这样我们可以初步提取到包含我们想要信息的数据,后面可以根据该输出进一步处理文本:

cat old.log | grep "setAlpha" | awk -F: '{ print $4}' | awk -F, '{ print $1"="$2 }'

上面语句的含义就是将文本以‘,’(逗号)为分界点就行分割,并且打印第1个和第2个元素,两个元素中间用‘=’符号连接。运行结果为:

现在的结果越来越接近我们想要的了,然后我们根据这一结果进一步处理:

cat old.log | grep "setAlpha" | awk -F: '{ print $4}' | awk -F, '{ print $1"="$2 }' | awk -F= '{ print $2 ","  $4 }'

我们根据上一步的结果以‘=’为分界点进行分割,然后打印第2个与第4个元素,两个元素之间用“,”连接,运行结果为:


可以看到通过我们之前一系列步骤的处理,我们想要的数据已经呈现出来了,对于数据量比较大的文本,我们可以将最终的结果存储到一个文件中:

cat old.log | grep "setAlpha" | awk -F: '{ print $4}' | awk -F, '{ print $1"="$2 }' | awk -F= '{ print $2 ","  $4 }' > new.log

我们打开new.log文件发现我们的结果已经在里面了:


掌握这个命令的逻辑之后,我们就可以从海量的数据中批量提取具有一定规则的字段。

Tips--利用shell脚本批量提取txt文件中任意字段相关推荐

  1. python批量提取pdf的数据_Python批量提取PDF文件中文本的脚本

    本文实例为大家分享了Python批量提取PDF文件中文本的具体代码,供大家参考,具体内容如下 首先需要执行命令pip install pdfminer3k来安装处理PDF文件的扩展库. import ...

  2. Python工具源码,Python批量提取PPT文件中的图片

    在办公场景当中,同样也有这样一个需求,那就是快速批量把PPT文件中的图片提取出来,毕竟一个个点击另存为太过于繁琐,以及耗费时间,前面本渣渣分享过如何应用Python批量提取PDF文件中的图片,而这一篇 ...

  3. python读json文件中不同的数据类型_怎么使用python提取json文件中的字段

    python中为什么用json有什么作用 python的json模块中如何将变量添加到里面 python的json模块第一个是要打开的文件,第二个是打开的操作,为什么会如果你早认清你在别人心中没那么重 ...

  4. Python脚本工具,PyMuPDF批量提取PDF文件中的图片

    如何批量快速提取出PDF中的图片文件,你是否遇到这样的一个问题,尤其是PPT文件转换为PDF文件,需要快速提取其中的图片文件,如果你恰好会那么一点py,同时复制粘贴没问题的话,那么相信你也能够很轻松的 ...

  5. 使用python批量修改txt文件中的信息

    使用python批量修改txt文件 在更改深度学习很多标签文件的时候,我们有时候需要自己修改txt文件里的路径,这时候如果写一个python程序,就会比较容易: import os import ra ...

  6. 利用shell脚本批量判断目标ip存活情况

    一.目的 有时候需要批量去判断目标ip是否存活,一个一个去试多麻烦所以写了个shell脚本去批量尝试,原理使用的是去ping目标ip,虽然这种方法受很多因素影响,比如网速,防火墙禁ping等,但是也是 ...

  7. 利用shell脚本批量提交网站404死链给百度

    网站运营人员对于死链这个概念一定不陌生,网站的一些数据删除或页面改版等都容易制造死链,影响用户体验不说,过多的死链还会影响到网站的整体权重或排名. 百度站长平台提供的死链提交工具,可将网站存在的死链( ...

  8. linux读取一行数据命令,Shell脚本一次读取文件中一行的2种写法

    写法一: #!/bin/bash while read line do echo $line     #这里可根据实际用途变化 done < urfile 写法二: #!/bin/bash ca ...

  9. [linux] shell脚本编程-统计日志文件中的设备号发通知邮件

    1.日志文件列表 比如:/data1/logs/2019/08/15/ 10.1.1.1.log.gz 10.1.1.2.log.gz 2.统计日志中的某关键字shell脚本 zcat *.gz|gr ...

最新文章

  1. eclipse静态部署tomcat
  2. 架构师之路 — 部署架构 — 集群部署
  3. java tif格式图片_java给tif格式图片加文字水印?
  4. Jquery中如何获取元素的文本,值,属性和内容
  5. 阿里云官方网站免费套餐怎么抢
  6. LeetCode 992. K 个不同整数的子数组(双指针)
  7. PowerDesigner连接mysql逆向生成pdm
  8. PowerShell 方式部署Sharepoint Solution
  9. C++中关于指针入门的最好的文章
  10. 字节跳动 测试开发面经
  11. 数据库系统的体系结构
  12. 数据分析进阶 - 评分模型权重计算方法
  13. java中string的方法_Java中String常用方法
  14. 51单片机前言知识总结
  15. 好程序员大数据培训之Hadoop常见问题
  16. 【Ubuntu16.04】搭建Hyperledger Fabric环境
  17. symbian程序的前台运行和后台运行
  18. 教你编写DOTA外挂
  19. svn: E155019: Can't upgrade as it is not a pre-1.7 work解决办法
  20. 服务器启动显示防火墙,宝塔面板防火墙怎么打开

热门文章

  1. 渗透测试入门7之权限维持
  2. 静态内部类实现 单例模式
  3. 照着官网来安装openstack pike之neutron安装
  4. deepsooncms在Ubuntu 14.04上部署教程
  5. Java变量名命名规则
  6. 数据分析系统DIY1/3:CentOS7+MariaDB安装纪实
  7. ubuntu 下LAMP服务器环境搭建
  8. BDD敏捷开发入门与实战
  9. SuperMap IS.NET自定义Action添加Mark
  10. 分享ArcGis For Flex API 1.3 Diagram