Linux面试_3

如何对文件内容做统计

通过awk指令

语法: awk [options] ‘cmd’ file.

工作原理:

  1. 一次读取一行文本,按输入分隔符进行切片,切成多个组成部分.
  2. 将切片直接保存在内建的变量中,$1,$2…($0表示行的全部).
  3. 支持对单个切片判断,支持循环判断,默认分隔符为空格.
  4. 注意awk也是支持管道操作的.

案例:

提前准备了一个文本文件netstat.txt,内容如图:
在这里插入图片描述
假设我们要获取第一列proto和第四列local address的信息,应该怎么做?

awk '{print $1, $4}' netstat.txt,这就表示它会逐行遍历每个内容,然后将netstat文件中每行的内容按照空格切片出来,$1保存的是proto的内容,$4保存的是local address的内容,然后将他俩的内容打印出来即可.
在这里插入图片描述
跟操作相关的,都要用花括号括起来,指令都用单引号,字符串都用双引号


假设我们要打印proto为tcp的数据且统计出现的次数,应该怎么做?

awk '$1 == "tcp" && $2 == 1 {print $0}' netstat.txt,表示满足里两个条件之后就输出指定文本中该行的所有数据.


假设我们要打印proto为tcp且recv-q为1的整行的数据同时保留表头,应该怎么做?

借助內键遍历NR即可,表示记录读取的数据的行数.想要读取表头,我们将NR==1即可.

awk '($1 == "tcp" && $2 == 1 ) || NR == 1{print $0}' netstat.txt,这就表示输出的数据要么是第一行(也就是表头),要么就是满足两个条件的数据.


假设我们要统计tcp出现的次数,应该怎么做?

grep "tcp" netstat.txt | awk '{restcp[$1]++}END{for(i in restcp)print i "\t" restcp[i]}',表示先找到文本中符合条件的内容,每行内容再作为标准输入送给awk指令,awk指令中通过名为restcp为名的数组中,结束后遍历数组,打印下标i以及i对于的内容,中间通过制表符连接.


awk默认是按照空格来进行切片的,我想自定义分隔符,应该怎么做?

给定test.txt文件,其内容如图所示:
在这里插入图片描述
awk -F "," '{print $2}' test.txt, 表示将test.txt中的数据通过,进行切片,同时打印第二个切片变量中的数据,其中-F ","表示以什么符号来切片行内容.

总结:

awk指令很适合做一些格式化的东西

在这里插入图片描述
筛选给定文件中某些列的数据,文件可以有多个,有多个文件时,加个空格再在后面接文件名即可.

在这里插入图片描述
依据一定条件去筛选给定文件中的数据,然后输出满足条件的数据

在这里插入图片描述
对内容逐行去做统计操作,并列出对应的统计结果.


批量替换文件内容

通过sed指令

语法: sed [option] ‘sed command’ filename

sed全名stream editor,流编辑器.

适合用于对文本的**行内容(awk是对列进行处理)**进行处理,适合做文本编辑.


案例:

有这样一个代码文件及其内容如图所示:
在这里插入图片描述
我们可以注意到:其中Str应该是String,末尾的句号应该是分号,而且中间不应该有那么多空格.


首先,我们先将Str替换为String:

sed 's/^Str/String/' replace.java,表示将replace.java中的以Str开头的字符串替换为String.
其中,s表示要进行的是字符串的操作,^Str表示以Str开头,第二个反斜杠后面的内容表示将第一个反斜杠的内容替换为什么数据,此例中表示将Str开头的字符串替换为String

注意: 上面的命令只会输出更改后的数据,但是不会真正的修改文本中的数据,要真正的修改文本中的数据,要输入sed -i s/^Str/String/’ replace.java


然后,我们将末尾的句号替换为分号

sed -i 's/\.$/\;/' replace.java,表示将replace.java文件中末尾的句号替换为分号,其中,\是为了转义,$表示以什么结尾.


如果我们想将Jack的名字换成我们自己的应该怎么做?

sed -i s/Jack/Fan/ replace.java,这样子会出现问题,就是还会有一些Jack没有被替换,那是因为这条语句只会替换首次符合条件的字符串,怎么改进呢?

sed -i s/Jack/Fan/g replace.java,此时就会全文替换了,g就表示全文替换.


如果我们想删除中间的空行应该怎么做?

sed -i /^ *$/d replace.java,此时就表示删除了所有空行.
其中,^ *$表示空行,注意*和^中间有个空格,d表示删除符合条件的行,而且只有两个反斜杠.


如果我们想删除包含Integer字段的行应该怎么做?

sed -i '/Integer/d' replace.java


总结:
在这里插入图片描述
将replace.java中以Str开头的字符串替换为String.

在这里插入图片描述
将replace.java中的以.结尾的语句换成以;结尾.

在这里插入图片描述
将replace.java中的Jack全部替换为me.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值