文本处理
1. 文本列提取–cut命令
cut命令
选项:
-f:指定提取第几列
-c:字符范围,-c n-,-n,n-m,分别表示第n个字符后,前n个字符,n到m个字符。
-d:指定字符分割,默认通过制表符"\t"分割
举个例子:
提取普通用户的用户名:
2. 文本三剑客之---->awk
2.1 printf 格式化输出
格式:
printf ‘输出类型格式’ 输出的内容
输出类型:
输出类型 | 说明 |
---|---|
%ns | 输出字符串,n是数字代表输出几个字符 |
%ni | 输出整数,n是数字,代表输出几个数字 |
%n.mf | 输出小数,m和n是数字,达标输出的整数位数和小数位数, %8.2f表述,总共输出8位,其中两位是小数,6位是整数 |
输出格式:
输出格式 | 说明 |
---|---|
\a | 输出警告声音 |
\b | 输出退格键 |
\f | 清屏 |
\n | 换行 |
\t | 制表符,tab键 |
\r | 回车键 |
演示一下:
有一个文本如下:
- printf输出的时候不能直接打开文件,必须用命令的方式来,看下面的文件
- 我们直接输出试一下:
直接输出它会把文本放在一起数出来,看起来很别扭 - 标准的输出方式:
2.2 awk基本使用
2.2.1 awk语法
语法:
awk ‘条件1{动作1} 条件2{动作2} ······’ 文件名
- 还是针对上面的文件:我们提取一下第四列内容:
这里打印的时候,提取第几列,默认用空格分隔。(awk里面可以直接用print,它会自动换行) - 我们来写个实用的,提取根分区的磁盘空间剩余百分比
结果如下所示:
2.2.2 awk条件
我们来看一下awk的条件:
- BEGIN:如字面意思,在一开始,尚未读取数据的时候,先执行BEGIN后面的动作
- END:与上面相反,在awk处理完所有数据后,执行一下END后的动作
- 关系运算符:
- >,<,>=,<=,==,!=
- 正则表达式://:正则表达式需要写在双斜杠之间
- A~B:包含关系,如果A里面包含B为真。
举几个例子,为了方便,我们先写了一个成绩文档:
- 我们需要python成绩,并在前面和后面分别打印一些内容:
cat chengji.txt |grep -v name|awk 'BEGIN{print "开始了"} {print $5} END{print "打印完成"}'
- 我们来看看数学成功高于80分的人有哪些?
cat chengji.txt |grep -v name|awk '$4>=80{print $1}'
有点乱,简单解释一下逻辑:我们要的是分数,先排除掉标题行,awk在执行的时候,会先判断条件,如果条件符合,再执行动作,就是先判断第五列中那些分数高于80,再打印对应的name。
- 我们来指定打印一下fiona和hyg的语文和数学成绩吧~
cat chengji.txt |awk '$1~/(fiona|hyg)/ {print $2 "\t" $4}'
回忆一下,//里面放的是正则表达式。
- 还有一些神奇的用法,look
其实也是正则的应用啦
看完上面的内容,来稍微理解一下咱们这个awk的执行过程吧
2.2.3 awk内置变量
内置变量 | 作用 |
---|---|
$0 | 当前读入的一整行数据 |
$n | n是数字,表示分割出来的第几个字段,可以理解为第几列 |
FS | 指定分隔符 |
NR | 所在行号 |
NF | 分割出来的内容有几列 |
- 我们来看看指定分隔符FS,行号NR,字段数NF
注意:指定分隔符属于动作,NR、NF属于变量
需求:打印一下非伪用户的用户名、ID号、所在行号、分割了多少个字段
两种方法:
# 写法1,先筛选
cat /etc/passwd|grep "/bin/bash"|awk 'BEGIN{FS=":"}{print $1 "\t" $3 "\t" NR "\t" NF "\t"}'
# 写法2,用awk顺便筛选
awk 'BEGIN{FS=":"} /\/bin\/bash/{print $1 "\t" $3 "\t" NR "\t" NF "\t"}' /etc/passwd
3. 文本三剑客之 —>sed
主要用来将文本数据进行选取、替换、删除、新增的命令,sed可以卸载脚本里面
格式:
sed [选项] 动作 文件
3.1 sed选项
-n:我们通过sed命令会默认把所有数据输出到屏幕,该选项的作用是只输出sed处理过的文本
-e:允许对输入的数据用多条sed命令编辑,用分号分割。
-r:支持扩展正则
-i:sed是不会修改源文件的,改选项的目的是直接修改源文件
3.2 sed动作
a:追加,在当前行的后面添加一行或多行,如果添加多行,除了最后一行,需要加\ "na str"
c:行替换,用c后面的内容替换原数据行
i:插入,在当前行前插入一行
d:删除,删除指定行
p:打印:输出指定的行
s:字符串替换:"行范围s/旧字符串/新字符串/g"
3.3 sed实例
我们还是用passwd和上面的成绩单来举例吧~
- 我们来输出第一行的内容:
sed -n 1p /etc/passwd # 如果不加-n,会输出所有内容
- 删除:我们试着只留最后两行,其他都删掉“1,46表示删除1-46行”
- 追加:我们在最后一行插入点东西
- 插入:主要看与追加的对比
- 替换:可以和上面对比看效果
- 字符串替换
利用字符串串替换,我们可以实现批量注释文档:
也可以实现删除文本:
4. 其他文本处理命令
4.1 sort命令
给文本内的数据排序
选项:
-f:忽略大小写
-b:忽略每一行前面的空白部分
-n:以数值型进行排序,默认是字符串
-u:删除重复行
-t:指定分隔符,默认是制表符
-r:取反
-k:按照指定字段排序
稍微举几个例子吧:
这个文本中间是空格,我们如果想要以数学成绩来排序,就要和awk来联动,我们试一下吧~
针对指定分割符,我们来试试passwd文件吧,按照uid进行排序,如果不加-n选项,排序会变成这样:0,1,11,12,13,···,2,20,21,···按照字符串的方式排
4.2 uniq命令
取消重复行,与sort -u 一样,试一下吧,我们变了一下成绩单:
大致分析一下,两个还是有区别的:
- uniq只会去掉相邻的重复行,不相邻内容不会取消
- sort -u 则会取消所有重复行,只保留一行
4.3 wc命令
用来统计文本信息的命令
选项:
-l:只查看行数--line
-w:只统计单词数--word
-m:只统计字符数--??
我们可以和cut,awk等命令得到春数字