Linux指令4-文本处理(grep,sek,awk)

Linux指令4-文本处理(grep,sek,awk)1.grep2.sek(流式编辑器)基本格式:sed[选项]‘编辑指令’文件[选项]包括:–-n:将匹配结果输出(默认是全部文件+匹配到的文本,加了n就只输出匹配到的文本)–-i:直接修改文件内容–-r:扩展的正则表

0.脑图

在这里插入图片描述

1.grep、egrep

查找文件里符合条件的字符串,支持正则。

  • 基本格式
    grep [选项][匹配规则][目标文件或目录]
  • 常用选项
    -v 反向查找
    -r 文件夹下递归查找
    -n 显示行号
    -c 计算符合条件的行数
    -i 忽略大小写
    -H显示文件名 -h不显示文件名(存在多个文件时,默认会显示文件名)
    -A1 显示该行和之后一行的内容
    -B1 显示该行和之前一行的内容
    -C1 显示该行和前后一行的内容
[root@localhost test]# grep root /etc/passwd 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost test]# grep -n root /etc/passwd #显示行号
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost test]# grep -A1 -n root /etc/passwd #显示该行和之后一行的内容
1:root:x:0:0:root:/root:/bin/bash
2-bin:x:1:1:bin:/bin:/sbin/nologin
--
10:operator:x:11:0:operator:/root:/sbin/nologin
11-games:x:12:100:games:/usr/games:/sbin/nologin
  • 目标文件或目录
    可以有通配符。
    如果是目录需结合-r来使用。
    直接写目标文件,默认在当前路径下搜索该文件。
[root@localhost test]# ls -R /test
/test:
1.txt  2a.tt  old

/test/old:
2b.txt  3d.txt
[root@localhost test]# grep -H as *.txt #在当前路径下搜索后缀带txt的文件的内容匹配as
1.txt:asas
1.txt:asa
1.txt:asasasrtr
[root@localhost test]# grep -r as /test/  #目录下搜索
/test/old/2b.txt:as
/test/old/2b.txt:gdfgdfas
/test/1.txt:asas
/test/1.txt:asa
/test/1.txt:asasasrtr
/test/2a.tt:as
/test/2a.tt:fegsfas

2.sek(流式编辑器)

  • 特征:
  1. 基于模式匹配过滤及修改文本
  2. 逐行处理,并将结果输出到屏幕
  • 基本格式:sed [选项] ‘编辑指令’ 文件
  • [选项]包括:
    – -n:将匹配结果输出(默认是全部文件+匹配到的文本,加了n就只输出匹配到的文本)
    – -i:直接修改文件内容
    – -r:扩展的正则表达式,若与其他选项一起使用,应作为首个选项
[root@localhost data]# cat aa.txt #查看aa.txt
aaa o o aasas o
[root@localhost data]# sed -n '/^a/p' aa.txt #匹配以a开头的行,并将结果输出
aaa o o aasas o
[root@localhost data]# sed -i '/^a/p' aa.txt #匹配以a开头的行,并将结果直接修改到文件
[root@localhost data]# sed -n '/^a/p' aa.txt #匹配以a开头的行,并将结果输出,此时已经有两行了
aaa o o aasas o
aaa o o aasas o
  • 编辑指令:就是 条件(/正则/)+行号+指令的一条或多条组合,多条间可用分号做分隔。

–打印指令(p)

[root@localhost data]# cat bb.txt #查看bb.txt
sa
ddf
afggg
asasa
dfdfdfd
[root@localhost data]# sed -n '4p' bb.txt #输出第4行
asasa
[root@localhost data]# sed -n '4!p' bb.txt #输出除第4行以外的行
sa
ddf
afggg
dfdfdfd
[root@localhost data]# sed -n '2,4p' bb.txt #输出第2-4行
ddf
afggg
asasa
[root@localhost data]# sed -n '2,+3p' bb.txt #输出第2行和后面的3行
ddf
afggg
asasa
dfdfdfd
[root@localhost data]# sed -n '/^a/p' bb.txt #输出a开头的行 //内的是正则表达式^a
afggg
asasa
[root@localhost data]# sed -n '$=' bb.txt #输出总行数
5

–删除指令(d)

[root@localhost data]# cat bb.txt 
sa
ddf
afggg
asasa
dfdfdfd
[root@localhost data]# sed '1,3d' bb.txt #删除1-3行。只是在输出的结果中删除,不会影响原文件,若需要修改原文件 就要加-i
asasa
dfdfdfd
[root@localhost data]# sed '/^a/d' bb.txt #删除以a开头的行
sa
ddf
dfdfdfd
[root@localhost data]# sed '$d' bb.txt #删除最后行
sa
ddf
afggg
asasa
[root@localhost data]# sed '/^$/d' bb.txt 删除空行
sa
ddf
afggg
asasa
dfdfdfd

–替换指令(s/old/new/n)

[root@localhost data]# sed 's/a/A/' bb.txt #将每行中第1个a替换成A
sA
ddf
Afggg
Asasa
dfdfdfd
[root@localhost data]# sed 's/a/A/2' bb.txt #将每行中第2个a替换成A
sa
ddf
afggg
asAsa
dfdfdfd
[root@localhost data]# sed 's/a/A/g' bb.txt #将所有a替换成A
sA
ddf
Afggg
AsAsA
dfdfdfd
[root@localhost data]# sed -i '1,3s/^/#/' bb.txt #给1-3行加注释
[root@localhost data]# cat bb.txt
#sa
#ddf
#afggg
asasa
dfdfdfd
[root@localhost data]# sed -i 's/^#//' bb.txt #解除注释
[root@localhost data]# cat bb.txt
sa
ddf
afggg
asasa
dfdfdfd

–行前插入文本(i)

[root@localhost data]# sed '2iYY' bb.txt #在第2行前插入文本YY
#sa
YY
#ddf
#afggg
asasa
dfdfdfd
[root@localhost data]# sed '2,4iYY' bb.txt #在第2-4行前每行插入文本YY
#sa
YY
#ddf
YY
#afggg
YY
asasa
dfdfdfd

–行后插入文本(a)

[root@localhost data]# sed '2aYY' bb.txt #在第2行后插入文本YY
#sa
#ddf
YY
#afggg
asasa
dfdfdfd
[root@localhost data]# sed '2,4aYY' bb.txt #在第2-4行每行后插入文本YY
#sa
#ddf
YY
#afggg
YY
asasa
YY
dfdfdfd

–替换当前行(c)

[root@localhost data]# sed '2cYY' bb.txt #将第2行替换为YY
#sa
YY
#afggg
asasa
dfdfdfd
[root@localhost data]# sed '2cXX\nYY' bb.txt #将第2行替换为XX‘换行’YY  \n为换行符
#sa
XX
YY
#afggg
asasa
dfdfdfd

–读取文件到当前文件(r)

[root@localhost data]# cat aa.txt #查看文件aa.txt
aaa o o aasas o
[root@localhost data]# sed '2r aa.txt' bb.txt #在第二行下方插入aa.txt
#sa
#ddf
aaa o o aasas o
#afggg
asasa
dfdfdfd

–保存文件(w)

[root@localhost data]# sed '2,3w cc.txt' bb.txt #将第2-3行另存为文件cc.txt
#sa
#ddf
#afggg
asasa
dfdfdfd
[root@localhost data]# cat cc.txt #查看文件cc.txt
#ddf
#afggg

–复制行、剪贴行
首先要明确几个概念:

  • 模式空间、保持空间:
    1.模式空间:sed在此存放当前处理的行,若当前行不符合处理条件则原样输出,处理完当前行再读入下一行来处理
    2.保持空间:类似剪贴板,默认存放一个空行(换行符\n)
  • 复制、粘贴、剪切
    1.复制:模式空间->保持空间
    2.粘贴:保持空间->模式空间
    3.剪切:即复制后,在原文本中删除复制的行再粘贴
  • H、h、G、g
    1.H:模式空间追加到保持空间
    2.h:模式空间覆盖到保持空间
    3.G:保持空间追加到模式空间
    4.g:保持空间覆盖到模式空间
  • 完整的复制、剪切的过程
    1.复制:H/h -> G/g
    -H/h区别在于:h是覆盖,会覆盖掉保持空间里默认的空行
    -G/g区别在于:g是覆盖,会覆盖掉模式空间里存放的当前处理的行
    2.剪切:H/h -> d-> G/g (d是删除)

再来看指令:

[root@localhost data]# sed '2H;$G' bb.txt #把第2行复制到文件结尾
#sa,
#ddf
#afggg
asasa
dfdfdfd

#ddf
[root@localhost data]# sed '2h;$G' bb.txt #把第2行复制到文件结尾,注意没有空格了,这种情况最常用。
#sa
#ddf
#afggg
asasa
dfdfdfd
#ddf
[root@localhost data]# sed '2H;$g' bb.txt #把第2行复制到文件结尾,注意原文本最后一行被覆盖了
#sa
#ddf
#afggg
asasa
[root@localhost data]# sed '2h;2d;$G' bb.txt #把第2行剪切到文件结尾
#sa
#afggg
asasa
dfdfdfd
#ddf
[root@localhost data]# sed '1,2H;1,2d;$G' bb.txt #把第1-2行剪切到文件结尾(这里不方便的是,用H会带一个空格,但如果用h,因为前一行会被后一行覆盖,所以无法剪切多行。)
#afggg
asasa
dfdfdfd

#sa
#ddf

3.awk数据处理引擎

  • 特征:
  1. 基于模式匹配检查输入文本
  2. 逐行处理,并将结果输出到屏幕
    基本格式:awk [选项] ‘{指令、条件}’ 文件
  • [选项]常见包括:
    – -F:指定分隔符
  • {指令}包括:

–输出(print)

[root@localhost data]# awk ‘{print}’ dd.txt #输出文件dd.txt所有内容
Growth is not being sharpened,
become secular.
But to cross the river of time and space to know where to go.
Thus become independent and free,
tough and peaceful.

–内部变量

– $n:指定分隔的第n个字段
– $0:当前读入的整行文本的内容
–NF:记录当前处理行的字段个数(列数)
–NR:记录当前已读入行的数据(行数)

[root@localhost data]# awk '{print $1,$3}' dd.txt  #输出第一和第三个字符,默认分隔符是空格、Tab
Growth not
become 
But cross
Thus independent
tough peaceful.
[root@localhost data]# awk -Fo '{print $1,$3}' dd.txt #指定o为分隔符
Gr t being sharpened,
bec 
But t ss the river 
Thus bec 
t 
[root@localhost data]# awk '{print $0,NF,NR}' dd.txt  #$0当前读入整行的文本内容;NF当前处理行的字段个数(即列数);NR当前已读入的行的数量(行数)
Growth is not being sharpened, 5 1
become secular. 2 2
But to cross the river of time and space to know where to go. 14 3
Thus become independent and free, 5 4
tough and peaceful. 3 5

–数组
定义:数组名[下标]=元素值
调用:数组名[下标]
遍历:for(变量 in 数组名){print 数组名[变量]}

[root@localhost data]# awk 'BEGIN{class[0]="java";class[1]="python";print class[0],class[1]}'
java python
  • [条件]包括:

–过滤时机

  • 语法
    BEGIN{…}:预处理
    {…}:逐行处理
    END{…}:行后处理
  • 例子
[root@localhost data]# awk 'BEGIN{a=23;print a+2}' #预处理不需要指定文件
25
[root@localhost data]# awk 'BEGIN{a=3}{a++;print a}END{print a}' dd.txt #a初始为3,每处理一行a加1并输出a,a最后的结果为8
4
5
6
7
8
8

–正则表达式(//)

[root@localhost data]# awk -F: '/^root/{print}' /etc/passwd #列出所有以root开头的行
root:x:0:0:root:/root:/bin/bash

–匹配或不匹配(~匹配 !~不匹配)

[root@localhost data]# awk -F: '$1!~/^root/{print}' /etc/passwd #列出第一个字段不以root开头的行
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

–数值比较,逻辑比较,运算符
(就跟正常的语法差不多)

[root@localhost data]# awk 'NR%2==1{print}' dd.txt  #输出奇数行
Growth is not being sharpened,
But to cross the river of time and space to know where to go.
tough and peaceful.

–分支结构
单分支:if(条件){指令}
双分支:if(条件){指令1}else{指令2}
多分支:if(条件){指令1}else if{指令2}…else{指令N}

[root@localhost data]# awk -F: 'BEGIN{i=0;j=0}{if($3<=500){i++}else{j++}}END{print i,j}' /etc/passwd  #分别统计UID大于500,小于等于500的个数
17 2

今天的文章Linux指令4-文本处理(grep,sek,awk)分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:http://bianchenghao.cn/63285.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注