下面所说的是Linux中最重要的三个命令在业界被称为“三剑客”,它们是grep、sed、awk.

我们现在知道Linux下一切皆文件,对Linux的操作就是对文件的处理,那么怎么能更好的处理文件呢?这就要用到我们上面的三剑客命令。

三剑客的功能非常强大,但我们只需要掌握他们分别擅长的领域即可:grep擅长取行、sed擅长取行和修改、awk擅长取列。

在说这三个命令前我们要插入一个小插曲就是“正则表达式”。

一、正则表达式

所谓的正则表达式我个人理解就是正规的表示方法。他是用简单的方法来实现强大的功能,所以深受计算机爱好者的使用。

三剑客与正则表达式是什么关系呢?

我们可以这样理解,三剑客就是普通的命令,有的把他们叫做工具,在我看来都一样。而正则表达式就好比一个模版。三剑客能读懂这个模版。就这么简单。注意只有三剑客才能读懂这个模版哦!

现在他们的关系和功能都搞懂了,接下来我们就来认识下他们怎么结合的。正则表达式是一个模版,这个模版是由一些普通字符和一些元字符组成。普通字符包括大小写的字母和数字,而元字符则具有特殊的含义。具体如下

字符类

.:匹配任意单个字符

[]:匹配中括号内的任意一个字符

-:在[ ]中括号内表示字符的范围

^:位于[ ]中括号内的开头,匹配除括号内的字符之外的任意一个字符

数量限定符

?:匹配其前面的字符0次或1次

+:匹配其前面的字符至少1次

*: 匹配其前面的字符任意多次

{N}:匹配其前面的字符N次

{N,}:匹配其前面的字符至少N次

{,M}:匹配其前面的字符最多M次

{N,M}:匹配其前面的字符N到M次

位置限定符

^:匹配行首的位置

$:匹配行尾的位置

\<:匹配单词开头的位置(比如\<ro匹配root或robot)

\>:匹配单词结尾的位置(比如ot\>匹配root或robot)

\<word\>:精准匹配单词word

  

二、grep

文本过滤(模式:pattern)工具,grep, egrep

grep [options] pattern [file...]

  • --color=auto 对匹配到的文本着色显示
  • -v 显示不被pattern匹配到的行
  • -i 忽略字符大小写
  • -n 显示匹配的行号
  • -c 统计匹配的行数
  • -o 仅显示匹配到的字符串
  • -q 静默模式,不输出任何信息
  • -A # after, 后#行
  • -B # before, 前#行
  • -C # context, 前后各#行
  • -e 实现多个选项间的逻辑or关系
    grep –e ‘cat ’ -e ‘dog’ file
  • -w 匹配整个单词
  • -E 使用ERE,相当于egrep
  • -F 相当于fgrep,不支持正则表达式

举例子:

grep root passwd.txt        #查找文件内容包含root的行

grep -i root passwd.txt        #查找文件内容包含root(忽略大小写)的行

grep -v root passwd.txt        #查找文件内容不包含root的行

grep -w "root" passwd.txt        #查找文件内容包含整个单词"root"的行

grep ^s passwd.txt      #查找以s开头的行

grep n$ passwd.txt      #查找以n结尾的行

egrep "^([0-9]{1,3}.){3}[0-9]{1,3}$" log.txt | sort | uniq -c       #找出log文件中的所有ip地址并统计每个ip出现的次数

三、sed

sed是一种流编辑器,作用是实现对文件的增删改查,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。如果没有使诸如‘D’ 的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

sed [option]... 'script' inputfile

sed            流编辑器,实现对文件的增删改查
选项:
-n 屏蔽默认输出
-i 直接修改源文件
-e 可指定多个处理动作
-r 支持扩展表达式
{} 可组合多个命令,以;分隔
-f 使用sed脚本
定址符:
p 打印行
d 删除行
s 字符串替换
1 对第1行处理
1,3 对第1到3行处理
1,+3 对第1行后面3行处理
1~2 对1,3,5,7……行处理
1,$ 对1行到最后1行处理
/aa/,/bb/ 对a行到b行处理
/aaa/,9 对a行到第9行,若前9行没有,会显示后9行匹配的行

举例子:(注意:sed增删改如果不加 -i 选项的话只是预览模式,并没有真的增删改)

增:
i 行前插入
a 行后插入
sed '2ixx' m.txt 在第2行前插入行xx
sed '3,6ixx' m.txt 在第3-6行每行前插入xx
sed '2axx' m.txt 在第2行后插入xx
sed '/^yy/axx' m.txt 在yy开头的行后插入xx
删:
sed '3,5d' a.txt 删除第3到5行
sed '/xml/d' a.txt 删除所有包含xml的行
sed '/xml/!d' a.txt 删除不包含xml的行
sed '/^xml/d' a.txt 删除以xml开头的行
sed '$d' a.txt 删除最后1行
sed '/^$/d' a.txt 删除所有空行
sed '/^$/{n;/^$/d}' a.txt 删除重复空行,连续两个空行只保留一个
sed -r'/a|b/d' a.txt 删除a或b的行
sed '2,~2d' a.txt 删除2行到2的倍数行
改(加-i选项才会真的修改源文件):
c 行替换
s 字符串替换
sed '2cxx' m.txt 第2行替换成xx
sed '3,6cxx' m.txt 第3到6行替换成1行xx
sed -e '3cxx' -e '6cxx' m.txt 第3行和第6行替换成xx
sed '2cxx\nyy' m.txt 第2行替换成xx并换行写上yy(\n代表换行)
sed 's/test/demo/g' a.txt 将所有的test换成demo(常用)
sed 's/#ipv6=no/ipv6=yes/g' test.txt 将test.txt文件里的#ipv6=no改成ipv6=yes(sed的这种用法经常用来更改配置文件里的内容)
sed 's/a//g' a.txt 删除所有行的a
sed '4,7s/^/#/' a.txt 4到7行加#号
sed '4,7s/^#//' a.txt 4到7行去掉#号
sed 's/a/B/ig' a.txt 所有行的a替换成B(不区分大小写)
查:
sed –n ’20,30p’ b.txt 打印20到30行
sed -n '3p;6p' a.txt 打印第3和6行
sed -n '3,+6p' a.txt 打印第3行及其后6行
sed -n '/^bin/p' a.txt 打印以bin开头的行
sed -n 'p;n' a.txt 打印奇数行,n表示读下一行(隔行)
sed -n 'n;p' a.txt 打印偶数行,n表示读下一行(隔行)
sed -n '8,${n;p}' a.txt 打印8行到末尾所有的偶数行
sed -n '$=' a.txt 打印文件的行数
sed -n '/a/{=;p} ' b.txt 显示行号
sed -n l aaa.jpg 打印不可见字符

四、awk

报告生成器,格式化文本输出,有多种版本:New awk(nawk),GNU awk( gawk)

注意:program部分只能用单引号,不能用双引号,否则会报错.

awk [options] 'program' file

1、常用命令选项
-F 指定分隔符,默认空格或Tab键
-f 调用awk脚本
-v 调用外部shell变量 2、awk内置变量
$1..$n 指定分隔符号对应的值
$0 当前行的内容
$NF 最后一列
NF 指定分隔符号后,行的列数
NR 当前行的行号
FS 保存或设置字段分隔符
FNR 保存当前文件的行数
FILENAME 保存当前的文件名
ENVIRON 调用shell环境变量
awk '{print $0}' a.txt #打印文件所有内容($0代表整行)
awk '{print $1,$2}' a.txt #打印第1列和第2列的内容
awk -F":" '{print $1}' a.txt #以:为分隔符并打印第1列的内容
awk -F"," '{print NR,$NF}' a.txt #以,为分隔符并打印行号和最后一列
awk -F"[ .]" '{print $(NF-1)}' OFS="\t" a.txt #以空格或.为输入分隔符并以制表符为输出分隔符打印倒数第二列 3、正则表达式
/正则/ 匹配正则(行)
~/正则/ 匹配正则(列)
!~/正则/ 不匹配
awk -F":" '$1~/root/ {print $0}' /etc/passwd
awk -F":" '$1!~/root/ {print $0}' /etc/passwd
awk -F":" '$1~/^ro/ {print $3}' /etc/passwd
awk -F":" '$1~/[0-9]/ {print $1,$6}' /etc/passwd 4、数值比较
awk -F":" '$3==0{print $0}' /etc/passwd
awk -F":" '$3!=0{print $0}' /etc/passwd
awk -F":" '$1=="root"{print $0}' /etc/passwd 5、逻辑比较(多个条件)
逻辑与 && 多个条件同时成立
逻辑或 || 多个条件有一个成立
逻辑非 ! 取反
awk -F":" '$7=="/bin/bash" && $3<500{print $0}' /etc/passwd
awk -F":" '$7=="/bin/bash" || $3<500{print $0}' /etc/passwd

Linux文件处理三剑客(grep、sed、awk)的更多相关文章

  1. Linux三剑客grep/sed/awk

    grep/sed/awk被称为linux的“三剑客” grep更适合单纯的查找或匹配文本: sed更适合编辑匹配到的文本: awk更适合格式化文本,对文本进行较复杂各式处理: Grep --color ...

  2. linux三剑客grep|sed|awk实践

    最好先学习正则表达式的基本用法,以及正则表达式BREs,EREs,PREs的区别 此坑待填 grep sed awk

  3. Linux三剑客grep、awk和sed

    grep,sed 和 awk是Linux/Unix 系统中常用的三个文本处理的命令行工具,称为文本处理三剑客.本文将简要介绍这三个命令并给出基本用法. 管道 在介绍这两个命令之前,有必要介绍一下Uni ...

  4. Linux三剑客grep、awk、sed

    何为Linux三剑客? 第一个剑客是 grep,grep 会根据正则表达式查找相关内容并打印对应的数据. 第二个剑客是 awk,awk 的名字来源于三个作者的名字简称,它可以根据定位到的数据行处理其中 ...

  5. [svc]linux正则实战(grep/sed/awk)

    企业实战: 过滤ip 过滤出第二行的 192.168.2.11. eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 ine ...

  6. 【Linux】 字符串和文本处理工具 grep & sed & awk

    Linux字符串&文本处理工具 因为用linux的时候主要用到的还是字符交互界面,所以对字符串的处理变得十分重要.这篇介绍三个常用的字符串处理工具,包括grep,sed和awk ■ grep ...

  7. 来聊一聊不low的Linux命令——find、grep、awk、sed

    前几天面试,被一位面试官嫌弃了"你的Linux命令有点low".被嫌弃也挺正常的,因为我的简历写的我自己都有点看不下去:了解Linux常用命令,如ls,tail -f等命令,基本满 ...

  8. 用linux文件处理三剑客将微信群成员导出的方法

    工具: Mac/Linux 系统 Chrome Linux命令:vi.cat. wc. grep. awk. sed.sort. uniq 步骤: 1.微信网页版登陆: https://wx.qq.c ...

  9. Linux文本处理三剑客之sed

    推荐新手阅读[酷壳]或[骏马金龙]开篇的教程作为入门.骏马兄后面的文章以及官方英文文档较难. [酷壳]:https://coolshell.cn/articles/9104.html [骏马金龙-博客 ...

随机推荐

  1. python分支结构与循环结构

    python分支结构 一.if 单条件形式 # 年轻人的世界都不容易 age > 18 age = int(input("请输入您的年龄:")) # input()函数 模拟 ...

  2. 《剑指offer》面试题39. 数组中出现次数超过一半的数字

    问题描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 你可以假设数组是非空的,并且给定的数组总是存在多数元素. 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, ...

  3. Git在实际生产中的使用

    文章目录 Git在实际生产中的使用 简单情况下的代码提交 Fetch and Pull 仅获取某分支的代码 远程仓库已经合并了别人的代码 冲突产生原因与解决办法 不恰当的多个Commit合并为一个 G ...

  4. TextBox,RichTextBox设置行高

    /// <summary> /// 设置行距 /// </summary> /// <param name="ctl">控件</param ...

  5. .NET 云原生架构师训练营(权限系统 RGCA 架构设计)--学习笔记

    目录 项目核心内容 实战目标 RGCA 四步架构法 项目核心内容 无代码埋点实现对所有 API Action 访问控制管理 对 EF Core 实体新增.删除.字段级读写控制管理 与 Identity ...

  6. for each ……in

    使用一个变量迭代一个对象的所有属性值,对于每一个属性值,有一个指定的语句块被执行. 作为ECMA-357(E4X)标准的一部分,for each...in语句已被废弃,E4X中的大部分特性已被删除,但 ...

  7. 学习JAVAWEB第十六天

    今天做了一个简单的登陆界面,HTML+CSS太不熟悉了,明天还得接着做

  8. Iceberg学习日记(1) 定位两个线上Iceberg查不到文件的问题

    前言 Iceberg是我们去年年底(2020)开始调研,目前上线了130多张表.主要用于流量日志清洗,数据报表,推荐特征基础数据.至今为也算是积累了一些使用及定位问题经验. 这篇文章会介绍两个线上Ic ...

  9. JavaScripts之柯里化与偏函数

    参考资料:https://github.com/mqyqingfeng/Blog/issues/42 柯里化(Currying): 定义:柯里化是表示将某个多参数的函数转换为一系列只有一个参数的函数的 ...

  10. plsql 储存过程 参数的传递方式?

    /* 存储过程 一.oracel存储过程 1.没有返回值 return 值: 2.用输出参数来代替返回值: 3.输出参数可以有多个 二.参数的传递方式 1. 按位置传递 2. 按名字传递 3.混合传递 ...