Linux的文本三剑客awk、sed、grep及其他文本处理命令,详细解析

本文详细介绍了Linux系统的文本处理工具,重点讲解了文本三剑客awk、sed和grep的用途、语法、参数及用法。awk用于文本截取,能进行复杂的统计和数据处理;grep用于文本过滤,方便查找特定模式的行;sed擅长文本替换,支持整行替换和局部替换。此外,还提到了tr、tail、head、cat、more和less等其他文本命令的用途和用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、文本三剑客

1.awk 文本截取

        1.用途

        2.完整语法

        3.分隔符

        4.内置变量

        5.流控

        6.函数

        7.数组

        8.求和 和 统计

2.grep 文本过滤

        1、用途

        2、语法

        3、常用选项

        4、用法

3.sed 文本替换

        1、用途

        2、语法

        3、常见参数

        4、动作

        5、使用

        6、&

二、其他文本命令

1.tr 命令

        1、用途

        2、用法

        3、参数

        4、用法

2.tail

        1、用途

        2、用法

        3、参数

        4、使用

3.head

        1、用途

        2、语法

        3、参数

        4、用法

4.cat

        1、用途

        2、语法

        3、参数

        4、用法

5.more

        1、用途

        2、语法

        3、参数

6.less


一、文本三剑客

1.awk 文本截取

        awk是一组编程语言,gawk - pattern scanning and processing language,打印匹配扫描和处理语言的行 。

        1.用途

        awk可用于过滤、截取、统计

        2.完整语法

        awk  ‘BEGIN(commands)pattern{commands}END{commands}’   file1

        3.分隔符

        awk的默认分隔符是空白,分隔符分为输入分隔符和输出分隔符。

        输入分隔符:

  •   默认为空白(空格和tab键)
  •     -F  指定分隔符
  •     FS  输入分隔符变量

        输出分隔符:

  •   默认为一个空格
  •     OFS=" " 输出分隔符变量( output field separator)

        举例

        以  /etc/passwd 文件为例,注意要修改重要文件一定要记得备份~~

  •   -F   和   OFS
1、-F
[root@zabbix linux-test]# awk -F: '{print $1,$7}' /etc/passwd |head
root /bin/bash
root /bin/bash
bin /sbin/nologin
bin /sbin/nologin
daemon /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
lp /sbin/nologin

2、OFS
[root@zabbix linux-test]# awk -F: 'OFS="#"{print $1, $3,$7}' /etc/passwd
root#0#/bin/bash
root#0#/bin/bash
bin#1#/sbin/nologin
bin#1#/sbin/nologin
......

3.原passwd文件
[root@zabbix linux-test]# cat passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
......

命令解析: 

        1. awk -F: '{print $1,$7}' /etc/passwd |head   

        指定  “:” 为分隔符 ,取第一列和第七列,head默认取前10行。

        2. awk -F: 'OFS="#"{print $1, $3,$7}' /etc/passwd

        以分号为分隔符,截取第1,3,7列,并且指定输出的分隔符为 #。

        4.内置变量

  • OFS  输出分隔符变量  output field separator
  • FS    输入分隔符变量   input field separator
  • NF   每行$0的字段数   number field
  • NR   当前处理的行号

使用:

1、显示passwd文件的第5行和第10行的行号和用户名
[root@nginx-kafka01 linux-text]# awk -F':' 'NR==5 ||NR==10{print NR,$1}' /etc/passwd
5 daemon
10 lp

2.
[root@nginx-kafka01 linux-text]# awk -F: 'BEGIN{num=0;print "start"}$1 ~/^chen/&&$3>2000 ||$NF ~ /bash/ {print NR, NF, $1, $3, $(NF-1),$NF;num++}END{print "行数:"num}'  /etc/passwd
start
1 7 root 0 /root /bin/bash
2 7 root 0 /root /bin/bash
41 7 chenyulin 1000 /home/chenyulin /bin/bash
42 7 chenyulin 1000 /home/chenyulin /bin/bash
43 7 echo 1001 /home/echo /bin/bas
.......
行数:36

        5.流控

        ① if

        语法:if (condition) statement1

        单分支:

[root@zabbix linux-test]# awk -F: '{if($1 ~ /chen/)print "chenjie";else print "ge" }' /etc/passwd
ge
ge
......
chenjie
chenjie
.....

命令解析: 

        awk -F: '{if($1 ~ /chen/)print "chenjie";else print "ge" }' /etc/passwd

         在 /etc/passwd 内寻找chen 如果找到了陈输出chenjie,否则就输出ge。

        多分支:

[root@zabbix linux-test]# awk -F: '{if ($3==0) {num++;print $1"是超级用户"} else if ($3>1&& $3<1000) num2++;else num3++}END{print "超级用户的数量是:"num,"系统用户的数量是:"unm2, "普通用户的数量是:"num3}'  /etc/passwd
root是超级用户
root是超级用户
超级用户的数量是:2 系统用户的数量是: 普通用户的数量是:38

 命令解析:

        在 passwd 文件里面,对$3(第三列)进行判断,如果等于0就是超级用户,在3~1000之间就是系统用户,否则就是普通用户,在里面定义了三个变量,分别对三个判断的数量进行计数。

        ② for

        语法:for (i in array){print array[i]}  或者  for (i=0;i<10;i++){print $i}

1、
[root@zabbix ~]# awk -F: '{split($6,home,"/");for (i in home)print i,home[i]}' /etc/passwd
1 
2 home
3 zhao
1 
2 home
3 feng
1 
2 home
3 feng

2、
[root@zabbix ~]#  awk -F: '{split($6,home,"/");for (i=2;i<4;i++)print i,home[i]}' /etc/passwd
2 home
3 zhao
2 home
3 zhao
2 home
3 feng
2 home
3 feng

 命令解析:

        1、这两条命令都使用了split函数进行分割,split的用法 split(s, a [, r [, seps] ]),第一个命令是以“:”为分隔符,截取$6,$6再使用split将$6进行分割,分割成home和分隔符“/”,再进行循环i在home里面就打印出home。

        2、这条命令与第一条差不多,解释参考第一条命令。

        6.函数

        常用的函数有下列几个:

  • length    统计长度
  • spilt       切割
  • gsub      替换
  • toupper  大写
  • tolower  小写
  • subst     截取
  • system  批量使用命令

        用法:

1、gsub    替换
[root@nginx-kafka01 linux-test]# cat 000 
cc/jj/yy/bb/123/456
[root@nginx-kafka01 linux-test]# awk  '{gsub("/"," ",$0);print $0}' 000 
cc jj yy bb 123 456

·····将 / 用 空格 代替

2、toupper  大写 和  tolower  小写
[root@nginx-kafka01 linux-test]# awk -F: '{print toupper($1)}' passwd
ROOT
BIN
DAEMON
[root@nginx-kafka01 linux-test]# awk -F: '{print tolower($1)}' passwd
root
bin
daemon
adm
lp
sync

3、subst  截取 和 length 
[root@nginx-kafka01 linux-test]# awk -F: 'length($1) >1 {print substr($1,1,5)}' passwd
root
bin
daemo
adm
lp

5、system  批量使用命令
awk '{system("useradd" $1)}' name.text

将name.text内的用户名,每个都新建一个用户,useradd

        7.数组

        1、参考5.流控的② for

        8.求和 和 统计

        这个将是一个题来说明。

        ① 统计账单,在bill.txt内存放了多个人的多笔账单,请将每个人的账单统计出来,并输出每个人的总账单。

[root@nginx-kafka01 linux-text]# cat bill.txt 
feng    100
feng    200
feng    350
li    200
li    239
li    890
zhang  100
zhang   350
[root@nginx-kafka01 linux-text]# awk '{name[$1]+=$2}END{for (i in name) print i,name[i]}' bill.txt 
li 1329
feng 650
zhang 450

          name[$1] 拿$1做字段key 让$2做value, 如果这个数组里面有key,就累加,初始值是0+value,END是文件里所有的行都处理完了,最后去执行end部分的命令,end里面的只执行一次 。

        ②  统计各个省份的票数,输出省份和总票数,按照降序排列

[root@nginx-kafka01 linux-text]# cat prov.txt 
山东 aa  2
河南 bb  3
江西 cc 3
湖南 aa 40
山东 bb 10
江西 dd 6
河南 cc 3
湖南 cc 3
[root@nginx-kafka01 linux-text]# awk '{pro[$1]+=$3}END{for (i in pro) print i,pro[i]}' prov.txt |sort -k2 -nr
湖南 43
山东 12
江西 9
河南 6

2.grep 文本过滤

        grep, egrep, fgrep - print lines matching a pattern,grep, egrep, fgrep打印匹配模的行。

        1、用途

                在文件中查找并显示包含指定字符串的行

        2、语法

                grep [OPTIONS] PATTERN [FILE...]  

                   grep 选项 模式 文件

        3、常用选项

  • -i:查找时忽略大小写
  • -v:反转查找,输出与模式不相符的行 
  • -n:显示符合模式要求的行号
  • -r:递归搜索所有文件
  • -o:只显示匹配的内容
  • -E:支持扩展正则
  • -A: 找到匹配行以及后几行
  • -B:输出匹配行以及前几行

        4、用法

         ①  -E 和 -o 和 -v

1.egrep   
[root@nginx-kafka01 linux-text]# egrep -o ^root /etc/passwd
root
root
[root@nginx-kafka01 linux-text]# egrep -v ^root /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

命令解析:

        egrep相当于grep -E 支持扩展正则,-o只会输出你所匹配到的,不匹配的不输出。 

        ② -A  和 -B 

[root@nginx-kafka01 linux-text]# egrep -A2 chen grade.tex 
2	chen	90	89	98//100
3	yang	40	99	100//69
4	liu	89	38	37//45
[root@nginx-kafka01 linux-text]# egrep -B2 chen grade.tex 
id	name	chinese	math	english//linux
1	cail	80	20	90//90
2	chen	90	89	98//100

③ -n 和  -i

1.-n 和 -i
[root@nginx-kafka01 linux-text]# egrep -ni hunan prov.txt 
9:HUNAN cc e
10:hunan yy 6
11:HunaN qq 9
[root@nginx-kafka01 linux-text]# cat prov.txt 
HUNAN cc e
hunan yy 6
HunaN qq 9

3.sed 文本替换

 sed - stream editor for filtering and transforming text,用于过滤和转换文本的流编辑器。

        1、用途

                文本替换

        2、语法

                sed [OPTION]... {script-only-if-no-other-script} [input-file]

        3、常见参数

  • -n    仅显示匹配的行(--quiet或--silent)
  • -i    直接对文件编辑匹配的位置
  • -r    可以根据行号和模式匹配进行操作
  • -e    以选项中指定的script来处理输入的文本文件
  • -f    以选项中指定的script文件来处理输入的文本文件

        4、动作

  • a  追加,末尾追加
  • c  整行替换
  • d  删除
  • i  插入,前插入
  • p  打印
  • s  局部替换
  • g  全部替换(一篇文章里面匹配到的全部替换)

        5、使用

        参数与动作可以结合使用。

        ① -n 

1.
[root@nginx-kafka01 linux-text]# sed -n '1,5p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

2.
[root@nginx-kafka01 linux-text]# sed -n '1p;5p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin

命令解析:

        第一条命令是,sed取出/etc/passwd文件的第1行到5行,第二条命令是,sed取出/etc/passwd文件的第1和5第行,要执行两条命令记得要加个“;”(分号)进行分隔。

        ② 参数-i 与动作 s 结合使用

        s的使用为s/旧/新/,旧:是想要被替换的,新:是想要替换成什么。

[root@nginx-kafka01 linux-test]# cat ifcfg-ens33 
TYPE="Ethernet"
BOOTPROTO="static"
ONBOOT="yes"

[root@nginx-kafka01 linux-test]# sed -i '/^ONBOOT/ s/yes/no/' ifcfg-ens33

[root@nginx-kafka01 linux-test]# cat ifcfg-ens33 
TYPE="Ethernet"
BOOTPROTO="static"
ONBOOT="no"

命令解析:

        在ifcfg-ens33文件内,将/etc/sysconfig/network-scripts/ifcfg-ens33里的ONBOOT=yes修改为no,s为局部替换,假如在一篇文章内有很多个ONBOOT,它只会将匹配到的第一个进行修改。

写法二:

[root@nginx-kafka01 linux-test]# cat cc.txt 
feng luo zhao chcen chen luo
cail feng luo li
feng luo zhao chcen li
chen 
[root@nginx-kafka01 linux-test]# sed -i '/^feng/ s/luo/Lin/2' cc.txt
[root@nginx-kafka01 linux-test]# cat cc.txt 
feng luo zhao chcen chen Lin
cail feng luo li
feng luo zhao chcen li
chen 

 命令解析:

        在cc.txt文件内,查找以feng开头的行,将这行的第二个luo替换成Lin。

        ④ -r

[root@nginx-kafka01 linux-test]# echo  aaa bbb ccc|sed -r 's/([a-z]+) ([a-z]+) ([a-z]+)/\3 \2 \1/'
ccc bbb aaa

 命令解析:

        s的使用为s/旧/新/,/([a-z]+) ([a-z]+) ([a-z]+)/为在echo处匹配到的,位置分别为123,/\3 \2 \1/ 是将前面的位置变成321 “\”为转义字符,可以让其后面的内容原样输出。

        6、&

        在sed内&可以理解为一个指针,指针指到谁,就用谁。

        举例:

[root@nginx-kafka01 linux-test]# echo 'i have a fat cat'|sed -n 's/.at/"&"/gp'
i have a "fat" "cat"

命令解析:

        在echo内匹配 .at 将匹配到的内容交给&,再在&处进行处理,结果为给匹配到的内容加上引号。 

        7、sed里单引号和双引号的区别
        双引号里可以使用shel里的变量,单引号不行,单引号和双引号里都可以存放模式。
 

二、其他文本命令

1.tr 命令

tr - translate or delete characters

        1、用途

        字符转换和删除的命令

        2、用法

        tr [OPTION]... SET1 [SET2]

        3、参数

  • -s  压缩连续相同的字符串成一个字符
  • -d   删除字符串

        4、用法

[root@nginx-kafka01 linux-test]# echo aaaaaa|tr -s a
a

[root@nginx-kafka01 linux-test]# echo aavvdd1234|tr av 89
8899dd1234

2.tail

tail - output the last part of files

        1、用途

                命令可用于查看文件的内容

        2、用法

        tail [OPTION]... [FILE]...

        3、参数

  • -f  循环读取
  • -q  不显示处理信息
  • -v  显示详细的处理信息
  • -c<数目> 显示的字节数
  • -n<行数> 显示文件的尾部 n 行内容
  • --pid=PID 与-f合用,表示在进程ID,PID死掉之后结束

        4、使用

        tail -f = tailf

1、取/etc/passwd 内的最后三行
[root@nginx-kafka01 linux-test]# tail -3 /etc/passwd
zhao:x:1016:1016::/home/zhao:/bin/bash
feng:x:1017:1017::/home/feng:/bin/bash
feng:x:1017:1017::/home/feng:/bin/bash

[root@nginx-kafka01 linux-test]# tail -n3 /etc/passwd
zhao:x:1016:1016::/home/zhao:/bin/bash
feng:x:1017:1017::/home/feng:/bin/bash
feng:x:1017:1017::/home/feng:/bin/bash


2、取从第3行开始直到末行
[root@nginx-kafka01 linux-test]# tail -n +3 /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
......

3.head

head - output the first part of files

        1、用途

        Print  the  first  10 lines of each FILE to standard output.  With more than one FILE, precede each with a header giving the file name.  With no FILE, or when FILE is -, read standard input.            

        将每个FILE的前10行打印到标准输出。 如果有多个FILE,则在每个FILE之前带有给出文件名的头。 如果没有FILE,或者FILE为-,读取标准输入。

        2、语法

        head [OPTION]... [FILE]...

        3、参数

  • -q 隐藏文件名
  • -v 显示文件名
  • -c<数目> 显示的字节数
  • -n<行数> 显示的行数

        4、用法

        head默认取钱10行。

取前两行
[root@nginx-kafka01 linux-test]# head -2 passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

4.cat

cat - concatenate files and print on the standard output

        1、用途

        Concatenate FILE(s), or standard input, to standard output.

        将文件(或标准输入)连接到标准输出        

        2、语法

         cat [OPTION]... [FILE]...

        3、参数

  • -n 或 --number:由 1 开始对所有输出的行数编号
  • -b 或 --number-nonblank:和 -n 相似,只不过对于空白行不编号
  • -s 或 --squeeze-blank:当遇到有连续两行以上的空白行,就代换为一行的空白行

        4、用法

[root@nginx-kafka01 linux-test]# cat >a.txt<<EOF
> sanchuang
> as
> EOF
[root@localhost lianxi]# cat a.txt
sanchuang
as
遇到EOF退出,EOF不固定可以定义为任何字母


[root@nginx-kafka01 linux-test]# cat -n passwd 
     1	root:x:0:0:root:/root:/bin/bash
     2	bin:x:1:1:bin:/bin:/sbin/nologin
     3	daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4	adm:x:3:4:adm:/var/adm:/sbin/nologin

5.more

more - file perusal filter for crt viewing,More是一个每次一屏一屏地翻页文本的过滤器

        1、用途

        全屏方式分页显示文件内容

        2、语法

     more [options] file [...]

        3、参数

  •  -d        显示帮助,而不是响铃
  •   -f        统计逻辑行数而不是屏幕行数
  •   -l        抑制换页(form feed)后的暂停
  •   -p        不滚屏,清屏并显示文本
  •   -c        不滚屏,显示文本并清理行尾
  •   -u        抑制下划线
  •   -s        将多个空行压缩为一行
  •   -NUM      指定每屏显示的行数为 NUM
  •   +NUM      从文件第 NUM 行开始显示
  •   +/STRING  从匹配搜索字符串 STRING 的文件位置开始显示
  •   -V        输出版本信息并退出

        4、用法

        分页显示文件内容,按回车 一行一行显示,按空格显示下一页,按b返回上一页,按q退出,放完会自动退出。

6.less

 less - opposite of more

        1、用途    

        Less是一个类似于more(1)的程序,但它也允许在文件中向后移动向前运动的方向。

        2、用法

        跟more差不多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值