ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

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

2022-01-15 11:34:21  阅读:142  来源: 互联网

标签:输出 文本处理 命令 sed awk print 文本 三剑客


文本处理

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当前读入的一整行数据
$nn是数字,表示分割出来的第几个字段,可以理解为第几列
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等命令得到春数字

标签:输出,文本处理,命令,sed,awk,print,文本,三剑客
来源: https://blog.csdn.net/qq_28197005/article/details/122486257

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有