shell编程-文本处理大全-printf-awk命令-sed命令-sort命令-uniq命令-wc命令-linux文本三剑客

文本处理

1. 文本列提取–cut命令

cut命令
选项:
-f:指定提取第几列
-c:字符范围,-c n-,-n,n-m,分别表示第n个字符后,前n个字符,n到m个字符。
-d:指定字符分割,默认通过制表符"\t"分割
举个例子:
提取普通用户的用户名:
shell编程-文本处理大全-printf-awk命令-sed命令-sort命令-uniq命令-wc命令-linux文本三剑客

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 回车键

演示一下:
有一个文本如下:
shell编程-文本处理大全-printf-awk命令-sed命令-sort命令-uniq命令-wc命令-linux文本三剑客

  • printf输出的时候不能直接打开文件,必须用命令的方式来,看下面的文件
  • 我们直接输出试一下:
    shell编程-文本处理大全-printf-awk命令-sed命令-sort命令-uniq命令-wc命令-linux文本三剑客直接输出它会把文本放在一起数出来,看起来很别扭
  • 标准的输出方式:
    shell编程-文本处理大全-printf-awk命令-sed命令-sort命令-uniq命令-wc命令-linux文本三剑客

2.2 awk基本使用

2.2.1 awk语法

语法:
awk ‘条件1{动作1} 条件2{动作2} ······’ 文件名

  • 还是针对上面的文件:我们提取一下第四列内容:
    shell编程-文本处理大全-printf-awk命令-sed命令-sort命令-uniq命令-wc命令-linux文本三剑客
    这里打印的时候,提取第几列,默认用空格分隔。(awk里面可以直接用print,它会自动换行)
  • 我们来写个实用的,提取根分区的磁盘空间剩余百分比
    shell编程-文本处理大全-printf-awk命令-sed命令-sort命令-uniq命令-wc命令-linux文本三剑客
    结果如下所示:
    shell编程-文本处理大全-printf-awk命令-sed命令-sort命令-uniq命令-wc命令-linux文本三剑客

2.2.2 awk条件

我们来看一下awk的条件:

  • BEGIN:如字面意思,在一开始,尚未读取数据的时候,先执行BEGIN后面的动作
  • END:与上面相反,在awk处理完所有数据后,执行一下END后的动作
  • 关系运算符:
    • >,<,>=,<=,==,!=
    • 正则表达式://:正则表达式需要写在双斜杠之间
    • A~B:包含关系,如果A里面包含B为真。

举几个例子,为了方便,我们先写了一个成绩文档:
shell编程-文本处理大全-printf-awk命令-sed命令-sort命令-uniq命令-wc命令-linux文本三剑客

  • 我们需要python成绩,并在前面和后面分别打印一些内容:
    shell编程-文本处理大全-printf-awk命令-sed命令-sort命令-uniq命令-wc命令-linux文本三剑客
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}'

shell编程-文本处理大全-printf-awk命令-sed命令-sort命令-uniq命令-wc命令-linux文本三剑客
有点乱,简单解释一下逻辑:我们要的是分数,先排除掉标题行,awk在执行的时候,会先判断条件,如果条件符合,再执行动作,就是先判断第五列中那些分数高于80,再打印对应的name。


  • 我们来指定打印一下fiona和hyg的语文和数学成绩吧~
cat chengji.txt |awk '$1~/(fiona|hyg)/ {print $2 "\t" $4}'

shell编程-文本处理大全-printf-awk命令-sed命令-sort命令-uniq命令-wc命令-linux文本三剑客
回忆一下,//里面放的是正则表达式。


  • 还有一些神奇的用法,look
    shell编程-文本处理大全-printf-awk命令-sed命令-sort命令-uniq命令-wc命令-linux文本三剑客
    其实也是正则的应用啦

看完上面的内容,来稍微理解一下咱们这个awk的执行过程吧
shell编程-文本处理大全-printf-awk命令-sed命令-sort命令-uniq命令-wc命令-linux文本三剑客


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

shell编程-文本处理大全-printf-awk命令-sed命令-sort命令-uniq命令-wc命令-linux文本三剑客


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,会输出所有内容

shell编程-文本处理大全-printf-awk命令-sed命令-sort命令-uniq命令-wc命令-linux文本三剑客

  • 删除:我们试着只留最后两行,其他都删掉“1,46表示删除1-46行”
    shell编程-文本处理大全-printf-awk命令-sed命令-sort命令-uniq命令-wc命令-linux文本三剑客
  • 追加:我们在最后一行插入点东西
    shell编程-文本处理大全-printf-awk命令-sed命令-sort命令-uniq命令-wc命令-linux文本三剑客
  • 插入:主要看与追加的对比
    shell编程-文本处理大全-printf-awk命令-sed命令-sort命令-uniq命令-wc命令-linux文本三剑客
  • 替换:可以和上面对比看效果shell编程-文本处理大全-printf-awk命令-sed命令-sort命令-uniq命令-wc命令-linux文本三剑客
  • 字符串替换
    shell编程-文本处理大全-printf-awk命令-sed命令-sort命令-uniq命令-wc命令-linux文本三剑客
    利用字符串串替换,我们可以实现批量注释文档:
    shell编程-文本处理大全-printf-awk命令-sed命令-sort命令-uniq命令-wc命令-linux文本三剑客
    也可以实现删除文本:
    shell编程-文本处理大全-printf-awk命令-sed命令-sort命令-uniq命令-wc命令-linux文本三剑客

4. 其他文本处理命令

4.1 sort命令

给文本内的数据排序
选项:

-f:忽略大小写
-b:忽略每一行前面的空白部分
-n:以数值型进行排序,默认是字符串
-u:删除重复行
-t:指定分隔符,默认是制表符
-r:取反
-k:按照指定字段排序

稍微举几个例子吧:
shell编程-文本处理大全-printf-awk命令-sed命令-sort命令-uniq命令-wc命令-linux文本三剑客
这个文本中间是空格,我们如果想要以数学成绩来排序,就要和awk来联动,我们试一下吧~
shell编程-文本处理大全-printf-awk命令-sed命令-sort命令-uniq命令-wc命令-linux文本三剑客
针对指定分割符,我们来试试passwd文件吧,按照uid进行排序,如果不加-n选项,排序会变成这样:0,1,11,12,13,···,2,20,21,···按照字符串的方式排
shell编程-文本处理大全-printf-awk命令-sed命令-sort命令-uniq命令-wc命令-linux文本三剑客

4.2 uniq命令

取消重复行,与sort -u 一样,试一下吧,我们变了一下成绩单:
shell编程-文本处理大全-printf-awk命令-sed命令-sort命令-uniq命令-wc命令-linux文本三剑客
shell编程-文本处理大全-printf-awk命令-sed命令-sort命令-uniq命令-wc命令-linux文本三剑客
大致分析一下,两个还是有区别的:

  • uniq只会去掉相邻的重复行,不相邻内容不会取消
  • sort -u 则会取消所有重复行,只保留一行

4.3 wc命令

用来统计文本信息的命令
选项:

-l:只查看行数--line
-w:只统计单词数--word
-m:只统计字符数--??

shell编程-文本处理大全-printf-awk命令-sed命令-sort命令-uniq命令-wc命令-linux文本三剑客
我们可以和cut,awk等命令得到春数字

上一篇:sed指令的一些使用记录


下一篇:linux命令练习