Linux文本三剑客(grep、sed、awk)+正则表达式

Linux文本三剑客:

grep、sed、awk

grep
  • 作用:过滤文本内容
  • 选项
    • -m #:匹配几次之后就停止(#的位置填入数字),按行匹配,一行算一次,不是一个字符算一次
    • -v:取反,就是匹配到的不需要
    • -n:显示匹配的行号
    • -c:显示匹配的行的数量
    • -o:只显示匹配到的内容,不显示其他内容
    • -A #:after,显示目标行以及之后的几行(#处填入数字)
    • -B #:before,显示目标行以及之前的几行(#处填入数字)
    • -C #:显示目标行以及前后几行(#处填入数字)
    • -e:实现多个过滤条件之间的逻辑或关系
    • -w:匹配整个单词
    • -E:使用扩展正则表达式
    • -f:文件模式进行匹配,匹配两个文件的相同的内容,以第一个文件作为参照,显示第二个文件中相匹配的内容
    • -r:递归目录,但是不处理软链接。还是匹配目录中的文本的内容
    • -R:递归目录,处理软链接
sed
  • 作用:主要是对文本内容的增删改查
  • 注意点:sed是一种流编辑器,除非确认了对文本的操作,否则文件中实际的数据并不会改变。如果不确认操作,展示结束后,缓冲区中的数据会立刻销毁,如果确认了操作,才会实际上对硬盘进行写入。
  • 选项
    • -e:指定命令来处理输入的文本文件,类似于grep中的-e,只有一个操作命令的话,-e可以不写
    • -f:用指定文件中的脚本来对另一个文件进行处理(不常用)
    • -i:命令会直接生效,实际上地对硬盘进行写入
    • -n:屏蔽默认输出,只显示一条结果
  • 操作命令
    • p:打印,3p表示打印第3行
      • $p:打印最后一行
      • 2,6p:打印2-6行
      • 2p;6p:打印2行和6行
      • p;n:打印奇数行
      • n;p:打印偶数行
      • /hello world/p:打印匹配内容的行
      • /^hello/:打印以hello开头的行
      • /hello$/:打印以hello结尾的行
    • r:扩展正则表达式
    • d:删除指定行
      • 免交互删除文件中的内容,但保留文件

        当然用黑洞文件也可以
      • 删除空行
    • =:显示行号
    • ;可以使用多个操作命令,比如说=;p,2d;p
    • s:替换字符串
      • 不写换第几个默认替换第一个
      • 写了换第几个就是替换第几个,如果这一行的原字符不够这么多,那就不替换
      • 写g就是全部替换
      • l&:大写换小写(这里的 l 是 L 的小写,不是 i 的大写),注意我这里没有加 -i ,所以文件里的内容并没有真正意义上替换,原先是大写,cat显示出来的还是大写
      • u&:小写换大写
      • 如何对字符串的位置进行调换
    • c:整行替换
      • 只要某一行包含目标内容,那么整行都会被替换掉,如下
      • 单字符替换,替换前后的字符串长度必须相同,注意并不是整体替换,当有多个字符进行替换时,它们是独立的多个字符,而不是一整个字符串
    • a:匹配内容的下一行添加
    • i:匹配内容的上一行添加
    • r:行后追加,读取其他文件的内容,然后在行后追加

      这样写也行,可以指定在具体内容所在行之后添加
awk
  • 作用:按行取列,这方面和cut类似,cut的默认分隔符是TAB键。awk的默认分隔符是SPACE键或者TAB键,但是多个空格或多个tab会自动压缩成1个,awk可以在免交互的情况下实现复杂的文本操作
  • awk一个强大的文本编辑工具,逐行读取文件内容,然后输出结果,它主要由三部分组成
    awk 选项 '模式或条件 {操作符 具体动作}' 处理对象
  • awk的选项,下面这两个记住就够了
    • -F:指定分隔符 默认是空格,可以不加
    • -v:变量赋值
  • awk的内置变量
    • 正常示例
      • $0:打印所有
    • 按行取列的格式
    • NR:指定行
      • 只有NR就只显示行号
      • NR加$0就会显示行号并且显示内容
      • NR==指定具体哪行
      • >和<也可以用
      • 偶数行,奇数行
    • NF:处理行的字段个数,$NF代表最后一个字段
    • awk作为运算器的格式
      awk 'BEGIN{print 3^2}'
    • awk的精确筛选
      • $n(</>/=):用于对比数值
      • $n~"字符串" 代表第n个字段包含某个字符串
      • $n!~"字符串" 代表第n个字段不包含某个字符串
      • $n=="字符串" 代表第n个字段为某个字符串
      • $n!="字符串" 代表第n个字段不为某个字符串
      • $NF:最后一个字段
    • awk的三元表达式
    • awk与数组

配合使用的其他功能

sort
  • 作用:按照行对文件内容进行排序,也可以根据不同的数据类型进行排序
  • 用法:
    • sort 选项 参数
    • cat 文件 | sort 选项
  • 选项:
    • -f:把大写字母放前面,默认会把小写字母排前面
    • -b:忽略每行前面的空格
    • -n:按照数字进行排序
    • -r:反向排序
    • -u:相同的数据只显示1行,也就是去重
    • -o:将排序后的文件内容转存到指定文件
  • 因为sort会默认排序,所以如果想用sort进行操作但又不想改变原文件内容的顺序,可以用 cat -n 文件 | sort -n 选项,cat -n表示显示行号,这样sort排序的时候就会按照第一个数字也就是行号排了,也就是不会改变顺序
uniq
  • 作用:按行进行处理,去重复行(只有连续出现的相同的行才是重复行)
  • 格式:
    • uniq 选项 参数
    • cat 文件 | uniq 选项
  • 选项:
    • -c:统计连续重复出现的行的次数,并且合并重复行,并展示
    • -u:仅显示出现一次的行
    • -d:仅显示重复出现的行
tr
  • 作用:字符替换、压缩、删除
  • 格式:
    • tr 选项 参数
    • cat 文件 | tr 选项
  • 选项:
    • -c:保留字符集1的字符,然后其他字符用字符集2进行替换

      回车可能也被替换成a了,验证一下
    • -d:删除字符集
    • -s:把重复出现的字符串压缩为一个字符串
    • -t:默认,可以不加,作用是把字符集2替换成字符集1
cut 快速裁剪
  • 作用:对字段进行截取和裁剪
  • 格式:
    • cut 选项 参数
    • cat 文件 | cut 选项
  • 选项:
    • -d:指定裁剪的分隔符(默认的分隔符是tab的空格)
    • -f:按行取列,根据第几个字段进行截取
    • -b:以字节为单位进行截取(不常用)
    • -c:以字符为单位进行截取(不常用)
    • --complement:排除所指定的字段,相当于取反
    • --output-delimiter:更改输出结果的默认分隔符
  • 举例:以冒号(:)为分隔符截取/etc/passwd文件中的第1到3个字段(1-3列)
split
  • 作用:把大文件拆分成若干小文件

  • -l:指定行数进行拆分(这是L的小写)

  • -b:指定大小进行拆分

正则表达式

  • 正则表达式是由一类特殊字符以及文本字符所编写的模式,其中有些字符不表示字符字面的含义。而表示控制或者通配的功能,用来处理文本内容当中的字符
  • Linux中的通配符:通配符用来匹配文件名或者目录名
    • 常见的通配符
      • []:范围匹配,注意字母的范围是:a A b B…..z Z
      • ?:匹配任意一个字符
      • *:匹配任意一个或多个字符
  • 正则表达式:
    • 元字符:
      • .:匹配任意单个字符,也可以是一个汉字
      • \:转义符,比如”.“指任意单个字符,但是”.“就是指一个”.“
      • ():分组
      • []:匹配指定范围内的单个字符,注意这里的字母范围就是正常的范围,比如[a-d]就是a,b,c,d
      • [[:blank:]]:匹配空格和制表符
      • [^字符]:表示取反,除了这个 ^在[]外表示以…为开头
      • 表示次数:*:匹配前面的字符任意次,0次也可以
        • 重点解释一下,比如说

          我们可以看到,*之前的字符就是匹配的目标 go*gle 表示g 和 gle之间可以有任意个o,再看第二条命令,g*gle表示gle之前可以有任意个g,但是google的gle之前是o,这就不能找到google,反而是找到了gle
      • .*:匹配前面的字符任意次,至少1次
        这就是.*和*的区别:
      • \?:匹配前面的字符1次或0次
      • +:匹配前面出现的字符最少1次,最多无限次
      • {n}:表示前面的字符只能出现n次,包括前面的字符
      • {m,n}:表示前面的字符最少出现m次,最多出现n次
      • {,n}:表示前面的字符最多出现n次,0次也算
      • {m,}:表示前面的字符最少出现m次
      • 测试题:提取出ifconfig ens33中的IP地址,子网掩码,广播地址
        答:ifconfig ens33 | grep "[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}"
    • 位置锚定
      • ^:行首锚定,以什么为开头
      • $:行尾锚定,以什么为结尾
      • ^$:匹配空行
      • ^root$:精准匹配某一行的内容
      • \<或者\b:词首锚定,用于单词模式匹配单词的左侧(连续的字母,数字,_,都算单词内部)
      • >或者\b:词尾锚定,用于单词模式匹配单词的右侧
      • \broot\b:匹配一个精准单词,而不是匹配行
    • 分组和逻辑或
      • 分组:\(\)
      • 逻辑或:\|
    • 扩展正则表达式
      • 就是把 \ 全部取消,比如:\(\) 变成了 (),\| 变成了 | 
      • 怎么使用:
        • grep -E
        • sed -r
        • egrep
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值