Linux文本三剑客–grep、sed、awk

文章目录

  • Linux文本三剑客--grep、sed、awk
    • 1、grep
      • 1.1什么是grep
      • 1.2使用grep
        • 命令格式
        • 命令参数
      • 基本正则表表达式
        • 匹配字符
        • 匹配次数
        • 位置锚点:定位出现的位置
      • 扩展正则表达式
    • 2.sed
      • 2.1什么是sed
      • 2.2使用sed
        • 命令格式
        • 常用选项options
        • 地址定界
        • 编辑命令command
        • sed用法演示
        • 地址界定演示
        • 编辑命令command演示
      • sed高级编辑命令
        • ① 案例:倒序输出文本内容
        • ① 显示偶数行
        • ② 倒序显示
        • ③ 显示奇数行
        • ④ 显示最后一行
        • ⑤ 每行之间加空行
        • ⑥ 把每行内容替换成空行
        • ⑦ 确保每一行下面都有一个空行
    • 3.awk
      • 什么是awk
      • 使用awk
        • 语法
        • 常用命令选项
        • (1)格式
        • 自定义变量
        • (1)-v var=value
        • (2)在program 中直接定义
      • printf命令
        • (1)格式化输出
        • (2)格式符:与item 一一对应
        • (3)修饰符:放在%c[/d/e/f...]之间
      • 操作符**
        • 格式
      • 演示
        • (1)模式匹配符
        • (2)逻辑操作符
        • (3)条件表达式(三目表达式)
      • grep sed awk比较

三者功能都是处理文本,但是侧重点各不相同,其中awk功能最强大,最复杂。grep更适合单冲的查找或匹配文本,sed更是适合编辑匹配到的文本,awk更适合格式化文本,对文本进行较复杂格式处理。

1、grep

1.1什么是grep

Linux系统中grep命令是一种强大的文本搜索工具,他能使用正则表达式搜索文本,并把匹配的行打印出来(匹配到的标红)。grep全程是Global regular expression print,表示全局正则表达式版本。
grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2.

1.2使用grep

命令格式

grep [option] pattern file

命令参数

  • -A<显示行数>:除了显示符合范本样式的那一列之外,并显示该行之后的内容。
  • -B<显示行数>:除了显示符合样式的那一行之外,并显示该行之前的内容。
  • -C<显示行数>:除了显示符合样式的那一行之外,并显示该行之前后的内容。
  • -c:统计匹配的行数
  • -e :实现多个选项间的逻辑or 关系
  • -E:扩展的正则表达式
  • -f FILE:从FILE获取PATTERN匹配
  • -F :相当于fgrep
  • -i --ignore-case #忽略字符大小写的差别。
  • -n:显示匹配的行号
  • -o:仅显示匹配到的字符串
  • -q: 静默模式,不输出任何信息
  • -s:不显示错误信息。
  • -v:显示不被pattern 匹配到的行,相当于[^] 反向匹配
  • -w :匹配 整个单词

基本正则表表达式

匹配字符

  • . 匹配任意单个字符,不能匹配空行
  • [] 匹配指定范围内的任意单个字符
  • [^] 取反
  • [:alnum:] 或 [0-9a-zA-Z]
  • [:alpha:] 或 [a-zA-Z]
  • [:upper:] 或 [A-Z]
  • [:lower:] 或 [a-z]
  • [:blank:] 空白字符(空格和制表符)
  • [:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
  • [:cntrl:] 不可打印的控制字符(退格、删除、警铃…)
  • [:digit:] 十进制数字 或[0-9]
  • [:xdigit:]十六进制数字
  • [:graph:] 可打印的非空白字符
  • [:print:] 可打印字符
  • [:punct:] 标点符号

匹配次数

  • ***** 匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
  • .* 任意前面长度的任意字符,不包括0次
  • ? 匹配其前面的字符0 或 1次
  • + 匹配其前面的字符至少1次
  • {n} 匹配前面的字符n次
  • {m,n} 匹配前面的字符至少m 次,至多n次
  • {,n} 匹配前面的字符至多n次
  • {n,} 匹配前面的字符至少n次

位置锚点:定位出现的位置

  • ^ 行首锚定,用于模式的最左侧
  • $ 行尾锚定,用于模式的最右侧
  • ^PATTERN$,用于模式匹配整行
  • ^$ 空行
  • ^[[:space:]].*$ 空白行
  • < 或 \b 词首锚定,用于单词模式的左侧
  • > 或 \b 词尾锚定;用于单词模式的右侧
  • <PATTERN>

扩展正则表达式

(1)字符匹配:

  • . 任意单个字符
  • [] 指定范围的字符
  • [^] 不在指定范围的字符
  • 次数匹配:
  • * :匹配前面字符任意次
  • ? : 0 或1次
  • + :1 次或多次
  • {m} :匹配m次 次
  • {m,n} :至少m ,至多n次

(2)位置锚定:

  • ^ : 行首
  • $ : 行尾
  • <, \b : 语首
  • >, \b : 语尾
  • 分组:()
  • 后向引用:\1, \2, …

2.sed

2.1什么是sed

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

功能:主要用来自动编辑一个或多个文件,简化对文件的反复操作。

2.2使用sed

命令格式

sed [options] '[地址定界] command' file(s)

常用选项options

  • -n:不输出模式空间内容到屏幕,即不自动打印,只打印匹配到的行
  • **-e:**多点编辑,对每行处理时,可以有多个Script
  • -f:把Script写到文件当中,在执行sed时-f 指定文件路径,如果是多个Script,换行写
  • -r:支持扩展的正则表达式
  • -i:直接将处理的结果写入文件
  • -i.bak:在将处理的结果写入文件之前备份一份

地址定界

  • 不给地址:对全文进行处理
  • 单地址:
    • #: 指定的行
    • /pattern/:被此处模式所能够匹配到的每一行
  • 地址范围:
    • #,#
    • #,+#
    • /pat1/,/pat2/
    • #,/pat1/
  • ~:步进
    • sed -n ‘1~2p’ 只打印奇数行 (1~2 从第1行,一次加2行)
    • sed -n ‘2~2p’ 只打印偶数行

编辑命令command

  • d:删除模式空间匹配的行,并立即启用下一轮循环

  • p:打印当前模式空间内容,追加到默认输出之后

  • a:在指定行后面追加文本,支持使用\n实现多行追加

  • i:在行前面插入文本,支持使用\n实现多行追加

  • c替换行为单行或多行文本,支持使用\n实现多行追加

  • w:保存模式匹配的行至指定文件

  • r:读取指定文件的文本至模式空间中匹配到的行后

  • =:为模式空间中的行打印行号

  • !:模式空间中匹配行取反处理

  • s///

  • 加g表示行内全局替换;

  • 在替换时,可以加一下命令,实现大小写转换

  • \l:把下个字符转换成小写。

  • \L:把replacement字母转换成小写,直到\U或\E出现。

  • \u:把下个字符转换成大写。

  • \U:把replacement字母转换成大写,直到\L或\E出现。

  • \E:停止以\L或\U开始的大小写转换

sed用法演示

[root@along ~]# cat demo
aaa
bbbb
AABBCCDD
[root@along ~]# sed "/aaa/p" demo  #匹配到的行会打印一遍,不匹配的行也会打印
aaa
aaa
bbbb
AABBCCDD
[root@along ~]# sed -n "/aaa/p" demo  #-n不显示没匹配的行
aaa
[root@along ~]# sed -e "s/a/A/" -e "s/b/B/" demo  #-e多点编辑
Aaa
Bbbb
AABBCCDD
[root@along ~]# cat sedscript.txt
s/A/a/g
[root@along ~]# sed -f sedscript.txt demo  #-f使用文件处理
aaa
bbbb
aaBBCCDD
[root@along ~]# sed -i.bak "s/a/A/g" demo  #-i直接对文件进行处理
[root@along ~]# cat demo
AAA
bbbb
AABBCCDD
[root@along ~]# cat demo.bak
aaa
bbbb
AABBCCDD

地址界定演示

[root@along ~]# cat demo
aaa
bbbb
AABBCCDD
[root@along ~]# sed -n "p" demo  #不指定行,打印全文
aaa
bbbb
AABBCCDD
[root@along ~]# sed "2s/b/B/g" demo  #替换第2行的b->B
aaa
BBBB
AABBCCDD
[root@along ~]# sed -n "/aaa/p" demo
aaa
[root@along ~]# sed -n "1,2p" demo  #打印1-2行
aaa
bbbb
[root@along ~]# sed -n "/aaa/,/DD/p" demo
aaa
bbbb
AABBCCDD
[root@along ~]# sed -n "2,/DD/p" demo
bbbb
AABBCCDD
[root@along ~]# sed "1~2s/[aA]/E/g" demo  #将奇数行的a或A替换为E
EEE
bbbb
EEBBCCDD

编辑命令command演示

[root@along ~]# cat demo
aaa
bbbb
AABBCCDD
[root@along ~]# sed "2d" demo  #删除第2行
aaa
AABBCCDD
[root@along ~]# sed -n "2p" demo  #打印第2行
bbbb
[root@along ~]# sed "2a123" demo  #在第2行后加123
aaa
bbbb
123
AABBCCDD
[root@along ~]# sed "1i123" demo  #在第1行前加123
123
aaa
bbbb
AABBCCDD
[root@along ~]# sed "3c123\n456" demo  #替换第3行内容
aaa
bbbb
123
456
[root@along ~]# sed -n "3w/root/demo3" demo  #保存第3行的内容到demo3文件中
[root@along ~]# cat demo3
AABBCCDD
[root@along ~]# sed "1r/root/demo3" demo  #读取demo3的内容到第1行后
aaa
AABBCCDD
bbbb
AABBCCDD
[root@along ~]# sed -n "=" demo  #=打印行号
1
2
3
[root@along ~]# sed -n '2!p' demo  #打印除了第2行的内容
aaa
AABBCCDD
[root@along ~]# sed 's@[a-z]@\u&@g' demo  #将全文的小写字母替换为大写字母
AAA
BBBB
AABBCCDD

sed高级编辑命令

  • h:把模式空间中的内容覆盖至保持空间中
  • H:把模式空间中的内容追加至保持空间中
  • g:从保持空间取出数据覆盖至模式空间
  • G:从保持空间取出内容追加至模式空间
  • x:把模式空间中的内容与保持空间中的内容进行互换
  • n:读取匹配到的行的下一行覆盖 至模式空间
  • N:读取匹配到的行的下一行追加 至模式空间
  • d:删除模式空间中的行
  • D:删除 当前模式空间开端至\n 的内容(不再传 至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed

① 案例:倒序输出文本内容

[root@along ~]# cat num.txt
One
Two
Three
[root@along ~]# sed '1!G;h;$!d' num.txt
Three
Two
One1!G 第一行不执行G命令,从第二行开始执行$!d 最后一行不删除

③ 总结模式空间与保持空间关系:

保持空间是模式空间一个临时存放数据的缓冲区,协助模式空间进行数据处理

(3)演示

① 显示偶数行

[root@along ~]# seq 9 |sed -n 'n;p'
2
4
6
8

② 倒序显示

[root@along ~]# seq 9 |sed  '1!G;h;$!d'
9
8
7
6
5
4
3
2
1

③ 显示奇数行

[root@along ~]# seq 9 |sed 'H;n;d'
1
3
5
7
9

④ 显示最后一行

[root@along ~]# seq 9| sed 'N;D'
9

⑤ 每行之间加空行

[root@along ~]# seq 9 |sed 'G'
123456789---

⑥ 把每行内容替换成空行

[root@along ~]# seq 9 |sed "g"---

⑦ 确保每一行下面都有一个空行

[root@along ~]# seq 9 |sed '/^$/d;G'
123456789

3.awk

什么是awk

awk是一种编程语言,用于在Linux下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件、其他命令的输出。它支持用户自定义函数和动态正则表达式等先进功能。awk有很多内建的功能,比如数组、函数等。

使用awk

语法

awk` `[options] ``'program'` `var=value ``file``…``awk` `[options] -f programfile var=value ``file``…``awk` `[options] ``'BEGIN{ action;… } pattern{ action;… } END{ action;… }'` `file` `...

常用命令选项

  • -F fs:fs指定输入分隔符,fs可以是字符串或正则表达式。
  • -v var=value:赋值一个用户定义变量,将外部变量传递给awk
  • -f scripfile:从脚本文件中读取awk命令
    awk变量
    变量:内置和自定义变量,每个变量前加-v命令选项

(1)格式

  • FS输入字段分隔符默认为空白字符
  • OFS输出字段分隔符,默认为空白字符
  • RS :输入记录分隔符,指定输入时的换行符,原换行符仍有效
  • ORS :输出记录分隔符,输出时用指定符号代替换行符
  • NF :字段数量,共有多少字段, NF引用最后一列,NF引用最后一列,NF引用最后一列,(NF-1)引用倒数第2列
  • NR行号,后可跟多个文件,第二个文件行号继续从第一个文件最后行号开始
  • FNR :各文件分别计数, 行号,后跟一个文件和NR一样,跟多个文件,第二个文件行号从1开始
  • FILENAME :当前文件名
  • ARGC :命令行参数的个数
  • ARGV :数组,保存的是命令行所给定的各参数,查看参数
[root@along ~]# cat awkdemo
hello:world
linux:redhat:lalala:hahaha
along:love:youou
[root@along ~]# awk -v FS=':' '{print $1,$2}' awkdemo  #FS指定输入分隔符
hello world
linux redhat
along love
[root@along ~]# awk -v FS=':' -v OFS='---' '{print $1,$2}' awkdemo  #OFS指定输出分隔符
hello---world
linux---redhat
along---love
[root@along ~]# awk -v RS=':' '{print $1,$2}' awkdemo
hello
world linux
redhat
lalala
hahaha along
love
you
[root@along ~]# awk -v FS=':' -v ORS='---' '{print $1,$2}' awkdemo
hello world---linux redhat---along love---
[root@along ~]# awk -F: '{print NF}' awkdemo
2
4
3
[root@along ~]# awk -F: '{print $(NF-1)}' awkdemo  #显示倒数第2列
hello
lalala
love
[root@along ~]# awk '{print NR}' awkdemo awkdemo1
1
2
3
4
5
[root@along ~]# awk END'{print NR}' awkdemo awkdemo1
5
[root@along ~]# awk '{print FNR}' awkdemo awkdemo1
1
2
3
1
2
[root@along ~]# awk '{print FILENAME}' awkdemo
awkdemo
awkdemo
awkdemo
[root@along ~]# awk 'BEGIN {print ARGC}' awkdemo awkdemo1
3
[root@along ~]# awk 'BEGIN {print ARGV[0]}' awkdemo awkdemo1
awk
[root@along ~]# awk 'BEGIN {print ARGV[1]}' awkdemo awkdemo1
awkdemo
[root@along ~]# awk 'BEGIN {print ARGV[2]}' awkdemo awkdemo1
awkdemo1

自定义变量

(1)-v var=value

① 先定义变量,后执行动作print

[root@along ~]# awk -v name="along" -F: '{print name":"$0}' awkdemo
along:hello:world
along:linux:redhat:lalala:hahaha
along:along:love:you

② 在执行动作print后定义变量

[root@along ~]# awk -F: '{print name":"$0;name="along"}' awkdemo
:hello:world
along:linux:redhat:lalala:hahaha
along:along:love:you

(2)在program 中直接定义

可以把执行的动作放在脚本中,直接调用脚本 -f

[root@along ~]# cat awk.txt
{name="along";print name,$1}
[root@along ~]# awk -F: -f awk.txt awkdemo
along hello
along linux
along along

printf命令

(1)格式化输出

printf` `"FORMAT"``, item1,item2, ...

① 必须指定FORMAT

不会自动换行,需要显式给出换行控制符,\n

③ FORMAT 中需要分别为后面每个item 指定格式符

(2)格式符:与item 一一对应

  • %c: 显示字符的ASCII码

  • %d, %i: 显示十进制整数

  • %e, %E: 显示科学计数法数值

  • %f :显示

    为浮点数,小数 %5.1f,带整数、小数点、整数共5位,小数1位,不够用空格补上

  • %g, %G :以科学计数法或浮点形式显示数值

  • %s :显示字符串;例:%5s最少5个字符,不够用空格补上,超过5个还继续显示

  • %u :无符号整数

  • %%: 显示% 自身

(3)修饰符:放在%c[/d/e/f…]之间

  • #[.#]:第一个数字控制显示的宽度;第二个# 表示小数点后精度,%5.1f
  • -:左对齐(默认右对齐) %-15s
  • +:显示数值的正负符号 %+d

操作符**

格式

  • 算术操作符:

    • x+y, x-y, x*y, x/y, x^y, x%y
    • -x: 转换为负数
    • +x: 转换为数值
  • 字符串操作符:没有符号的操作符,字符串连接

  • 赋值操作符:

    • =, +=, -=, *=, /=, %=, ^=
    • ++, –
  • 比较操作符:

    • ==, !=, >, >=, <, <=
  • 模式匹配符:~ :左边是否和右边匹配包含 !~ :是否不匹配

  • 逻辑操作符:与&& ,或|| ,非!

  • 函数调用: function_name(argu1, argu2, …)

  • 条件表达式(三目表达式):

    selector

    ?

    if-true-expression

    :

    if-false-expression

    • 注释:先判断selector,如果符合执行 ? 后的操作;否则执行 : 后的操作

演示

(1)模式匹配符

---查询以/dev开头的磁盘信息
[root@along ~]# df -h |awk -F: '$0 ~ /^\/dev/'
/dev/mapper/cl-root   17G  7.3G  9.7G  43% /
/dev/sda1           1014M  121M  894M  12% /boot
---只显示磁盘使用状况和磁盘名
[root@along ~]# df -h |awk '$0 ~ /^\/dev/{print $(NF-1)"---"$1}'
43%---/dev/mapper/cl-root
12%---/dev/sda1
---查找磁盘大于40%的
[root@along ~]# df -h |awk '$0 ~ /^\/dev/{print $(NF-1)"---"$1}' |awk -F% '$1 > 40'

(2)逻辑操作符

[root@along ~]# awk -F: '$3>=0 && $3<=1000 {print $1,$3}' /etc/passwd
root 0
bin 1
[root@along ~]# awk -F: '$3==0 || $3>=1000 {print $1}' /etc/passwd
root
[root@along ~]# awk -F: '!($3==0) {print $1}' /etc/passwd
bin
[root@along ~]# awk -F: '!($0 ~ /bash$/) {print $1,$3}' /etc/passwd
bin 1
daemon 2

(3)条件表达式(三目表达式)

[root@along ~]# awk -F: '{$3 >= 1000?usertype="common user":usertype="sysadmin user";print usertype,$1,$3}' /etc/passwd
sysadmin user root 0
common user along 1000

grep sed awk比较

  • grep:文本过滤器,如果仅仅是过滤文本,可使用grep,其效率要比其他的高很多
  • sed:stream editor,流编辑器,默认只处理模式空间,不处理原数据
  • awk:报告生成器,格式化以后显示。如果对处理的数据需要生成报告之类的信息,或者你处理的数据是按列进行处理的,最好使用awk

Linux文本三剑客--grep、sed、awk相关推荐

  1. Shell ❀ 三剑客 - Grep + Sed + Awk

    文章目录 八.三剑客 - Grep + Sed + Awk 1.Grep - 过滤 1.1 常用grep参数 1.2 使用方法 2.Sed - 行匹配 2.1 执行原理 2.2 常见语法 2.3 使用 ...

  2. 三剑客grep sed awk

    三剑客 正则(RE)表达式 应用场景 规则 注意事项 正则符号 基础正则 扩展正则 正则实例 正则 VS 通配符 三剑客 grep sed sed核心应用 awk awk执行过程 内置变量 awk 正 ...

  3. Linux文本三剑客(grep、sed、awk)

    目录 grep 1.什么是grep和rgrep? 2.使用grep 2.1.命令格式 2.2.命令功能 2.3.命令参数 3.实战演示 sed 1.认识sed 2.使用sed 2.1.命令格式 2.2 ...

  4. Linux三剑客 grep sed awk 详细使用方法

    Linux中最重要的三个命令在业界被称为"三剑客",它们是awk,sed,grep. 我们现在知道Linux下一切皆文件,对Linux的操作就是对文件的处理,那么怎么能更好的处理文 ...

  5. 15分钟搞定Linux三剑客 grep sed awk

    剑客grep 来者何人 grep是linux上的字符串搜索匹配命令.这个名字来自于linux编辑器vim的一个命令g/re/p,表示全局匹配某个正则表达式并打印出来,这也体现了grep自身的功能. 基 ...

  6. Linux高级专题详解--shell编程大全(shell变量,if语句,case语句,for循环,while循环,函数调用,数组,正则表达式,shell脚本三剑客--grep,sed,awk家族)

    shell编程 初始shell 程序 语言 编程 ---------------------------------- 语言 自然语言:汉语.英语 计算机语言:c语言.c++.(java php py ...

  7. linux 文本编辑命令grep sed awk

    grep grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具 ...

  8. Linux文本三剑客之sed仗剑走天涯

    一,sed是什么? sed是Strem Editor(流编辑器)缩写,是操作.过滤和转换文本内容的强大工具.对文件内容逐行(行编辑器,一行读取一次,对行编辑)进行处理调用操作并显示到STDOUT,常用 ...

  9. Linux进阶 vim grep sed awk 正则表达式

    01 Linux上的文本编辑器vim vim 编辑器是什么 vim 编辑器的三种模式 注意大小写!!! 打开文件时文件可以存在或者不存在,不存在时当关闭的时候系统会创建 命令模式 • 用vim FIL ...

最新文章

  1. 1024程序员节,你是我们要找的那条锦鲤吗?
  2. Openstack组建部署 — Environment of Controller Node
  3. 选择查询 mysql_具体的mysql选择查询
  4. python自带编译器如何生成exe_别再问我怎么Python打包成exe了!
  5. 《Unit Testing》1.1 -1.2 单元测试的目的
  6. 对微软的敌视何时休? 从一篇语言评论文章对C#的评价说起
  7. linux设置web服务器配置,Linux下配置功能完善的Web服务器
  8. 修改Chrome浏览器默认背景颜色为浅绿色(转)
  9. mysql not in 的坑 -- null 值
  10. 20170314--服务器监控
  11. C#获取dynamic(动态)或非动态实体的属性值
  12. python row column_将rowcolumnvalue数据转换为数组numpy
  13. 希尔伯特变换与SSB调制
  14. 希尔伯特变换到底有什么用
  15. 深刻理解:无人机数据系统应用
  16. Dzd电子书格式转换程序Txt2Dzd
  17. ZOJ 3987 秦皇岛现场赛G题 java
  18. 阿里云域名注册+网站备案
  19. VB中关于RND产生随机数
  20. 台式计算机DNS地址配置无法保存,电脑设置不了DNS地址怎么办

热门文章

  1. 软件行业中的鱼骨图运用
  2. 说一下软件测试行业的优缺点
  3. jtable 表头 透明_和田玉的韧性和透明度如何?你了解吗?它们其实是这样的!...
  4. 一些概率条件判断和组合数学题
  5. matlab 神经元系统,应用Matlab设计人工神经元网络控制系统
  6. 渗透测试|网络安全常用靶场
  7. 邮件服务器搭建,可连接客户端
  8. html网页的无缝拼接,2、图形化的网页-)图形的无缝拼接
  9. 用狄拉克符号推导旋转矩阵
  10. 宝洁的消费者研究的方法和趋势