Linux三剑客grep、sed、awk(包括练习题)

这篇具有很好参考价值的文章主要介绍了Linux三剑客grep、sed、awk(包括练习题)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Linux grep、sed、awk(包含练习题)

一、grep

Linux grep (global regular expression) 命令用于查找文件里符合条件的字符串或正则表达式。

  1. 基本用法与常见的正则表达式
grep [options] pattern [files]
命令 	参数	   匹配模式	文件数据
	-i:忽略大小写进行匹配。
	-v:反向查找,只打印不匹配的行。
	-n:显示匹配行的行号。
	-E 或 --extended-regexp : 将样式为延伸的正则表达式来使用。
	-q 或 --quiet或--silent : 不显示任何信息。
	-o 或 --only-matching : 只显示匹配PATTERN 部分。

`找到mysql有关的行并显示行号`
[root@localhost /]# grep "mysql" /tmp/passwd.txt -n
49:mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin

`找到MYSQL有关的行不区分大小写`
[root@localhost /]# grep "MYSQL" /tmp/passwd.txt -i
49:mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin

`找到不是mysql有关的行`
[root@localhost /]# grep  "mysql" /tmp/passwd.txt -v
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

`统计还有root行的行数`
[root@localhost /]# grep  "root" /tmp/passwd.txt -c
2

---^符号 锚定行的开始 如:'^grep'匹配所有以grep开头的行
`^ 以什么开头`
`找到m开头的行 不区分大小写`
[root@localhost /]# grep  '^m' /tmp/luffy.txt -i
My qq is 877348180.
My name is chaoge.

---$符号 锚定行的结束 如:'grep$'匹配所有以grep结尾的行
`$ 以什么开结尾`
[root@localhost /]# grep  'oldboy$' /tmp/luffy.txt -i
I am oldboy

`找到luffy.txt文件中的空行   '^$'以空开头 以空结尾`
[root@localhost /]# grep  '^$' /tmp/luffy.txt -n
3:
5:

`找到luffy.txt文件中的非空行`
[root@localhost /]# grep  '^$' /tmp/luffy.txt -v
I am oldboy
I like linux.
My name is xuxuxu
#Our school website is http://xixixi.com

`找到luffy.txt文件中的非空非注释行`
[root@localhost /]# grep  '^$|^#' /tmp/luffy.txt -Ev
I am oldboy
I teach linux.
I like python.
My qq is 877348180.
My name is chaoge.

---.符号 表示任意一个字符,有且只有一个,不包含空行
`"."点表示任意一个字符,有且只有一个,不包含空行`
'匹配出".ac",找出任意一个两位字符,包含s'
[root@localhost /]# grep  '.s' /tmp/luffy.txt 
My qq is 877348180.
My name is chaoge.
Our school website is http:/loldboyedu.com

`找到以.结尾的行 直接写.$会被当做任意字符 用\进行转义`
[root@localhost /]# grep  '\.$' /tmp/luffy.txt -i
I teach linux.
I like python.
My qq is 877348180.
My name is chaoge.

[root@localhost /]# grep  '/bin/bash$' /tmp/passwd.txt -n
1:root:x:0:0:root:/root:/bin/bash
44:test:x:1000:1000:test:/home/test:/bin/bash
45:xiaosang:x:1001:1001::/home/xiaosang:/bin/bash
46:biaosang:x:1002:1002::/home/biaosang:/bin/bash

`找到passwd.txt文件中以/bin/bash结尾的行,且只显示找到的/bin/bash本身`
[root@localhost /]# grep  '/bin/bash$' /tmp/passwd.txt -n -o
1:/bin/bash
44:/bin/bash
45:/bin/bash
46:/bin/bash

---*符号 匹配零个或多个先前字符如:'*grep'匹配所有一个或多个空格后紧跟grep的行
[root@localhost /]# grep  'boy*' /tmp/luffy.txt 
I am oldboy
#Our school website is http:/loldboyedu.com

`贪婪匹配`
[root@localhost /]# grep  '.*e' /tmp/luffy.txt  -o
I te
I like
My name is chaoge
Our school website is http:/loldboye

---[]符号 匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep
[root@localhost /]# grep [ib]s /tmp/luffy.txt
My qq is 877348180.
My name is chaoge.
Our school website is http:/loldboyedu.com

[root@localhost /]# grep [a-z] /tmp/luffy.txt
I am oldboy
I teach linux.
I like python.
My qq is 877348180.
My name is chaoge.
Our school website is http:/loldboyedu.com

---[^]符号 匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行
  1. 扩展正则表达式实践

    此处使用grep -E 进行实践扩展正则,egrep官网已经弃用

+符号
`+号表示匹配前一个字符1次或多次,必须使用grep -E 扩展正则`
[root@localhost /]# grep  'l+' /tmp/luffy.txt -E
I am oldboy
I teach linux.
I like python.
Our school website is http:/loldboyedu.com

?符号
`匹配前一个字符0次或1次`
`找到文件中包含gd或god的行`
[root@localhost /]# grep 'go?d' /tmp/test.txt -E
gd
god

|符号 在正则中表示或者的意思
`找到/tmp中txt文件,且名字里包含a或b的字符`
[root@localhost /]# find /tmp -name "*.txt" | grep -E "a|b"
/tmp/passwd.txt
/tmp/my_crontab.txt

()符号
`将一个或多个字符捆绑在一起,当作一个整体进行处理`
[root@localhost /]# grep -E 'g(oo|al)d' /tmp/test.txt 
good
gald

a{n,m}匹配a的次数
`重复前一个字符各种次数,可以通过-o参数显示明确的匹配过程`
[root@localhost /]# grep -E "x{2,4}" /tmp/xuxu.txt 
xxxxxxxuuuuuu
xxxxuuuu
xxuu

[root@localhost /]# grep -E "x{2,4}" /tmp/xuxu.txt -o
xxxx
xxx
xxxx
xx

`最多匹配4次`
[root@localhost /]# grep -E "x{,4}" /tmp/xuxu.txt
xxxxxxxuuuuuu
xxxxuuuu
xu
xxuu

`最少匹配4次`
[root@localhost /]# grep -E "x{4,}" /tmp/xuxu.txt
xxxxxxxuuuuuu
xxxxuuuu

二、sed

注意:sed和awk使用单引号,双引号有特殊解释

sed是Stream Editor(字符流编辑器)的缩写,简称流编辑器

sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

  1. 基本语法
sed [options] '{command}[flags]' filename    
	命令选项	内部选项和参数		文件
命令选项
-e script 将脚本中指定的命令添加到处理输入时执行的命令中,  多条件,一行中要有多个操作
-f script 将文件中指定的命令添加到处理输入时执行的命令中
-n		 仅显示script处理后的结果
-i        编辑文件内容
-i.bak    修改时同时创建.bak备份文件。
-r        使用扩展的正则表达式
!         取反 (跟在模式条件后与shell有所区别)

sed常用内部命令
a   在匹配后面添加
i   在匹配前面添加
p   打印
d   删除
s   查找替换
c   更改
y   转换   N D P 

flags
数字             表示新文本替换的模式
g:             表示用新文本替换现有文本的全部实例
p:             表示打印原始的内容
w filename:     将替换的结果写入文件

空地址 全文匹配
单地址 指定文件某一行
/pattern/	被模式匹配的每一行
范围区间 	10,20 十到二十行 10,+5第10行向下5行,/pattern1/,/pattern2/
步长	1~2,表示1,3,5,7,9行,2~2表示2,4,6,8,10偶数行
  1. 基本用法
`打印第2、3行`
[root@localhost /]# sed "2,3p" /tmp/luffy.txt -n
I teach linux.
I like python.

`打印第一行和下面3行`
[root@localhost /]# sed "1,+3p" /tmp/luffy.txt -n
I am oldboy
I teach linux.
I like python.
I like linux.

`找出有linux的行并打印`
[root@localhost /]# sed "/linux/p" /tmp/luffy.txt -n
I teach linux.
I like linux.

`删除第5行至末尾行的内容`
[root@localhost ~]# sed '5,$d' /tmp/luffy2.txt -i

`s///替换 g表示全局替换`
[root@localhost ~]# sed 's/linux/java/g' /tmp/luffy2.txt -i
[root@localhost ~]# cat /tmp/luffy2.txt 
I teach java.
I like python.

`多次替换`
[root@localhost ~]# sed -e 's/java/linux/g' -e 's/python/c++/g' /tmp/luffy2.txt -i
[root@localhost ~]# cat /tmp/luffy2.txt 
I teach linux.
I like c++.

`在文件第二行后追加一行`
[root@localhost ~]# sed '2a good good study' /tmp/luffy2.txt -i
[root@localhost ~]# cat /tmp/luffy2.txt 
I teach linux.
I like c++.
good good study

`在第三行前插入一行`
[root@localhost ~]# sed '3i happy every day' /tmp/luffy2.txt -i
[root@localhost ~]# cat /tmp/luffy2.txt 
I teach linux.
I like c++.
happy every day
good good study

`在每一行加上分隔符`
[root@localhost ~]# sed 'a -------------' /tmp/luffy2.txt -i
[root@localhost ~]# cat /tmp/luffy2.txt 
I teach linux.
-------------
I like c++.
-------------
happy every day
-------------
good good study
-------------

-------------

-------------

`双斜线正则匹配 配合d删除`
[root@localhost ~]# sed -e '/^$/d' -e '/^#/d' /tmp/luffy2.txt 
I teach linux.
I like c++.
happy every day
good good study
[root@localhost ~]# sed  '/^$/d;/^#/d' /tmp/luffy2.txt 
I teach linux.
I like c++.
happy every day
good good study


`取出linux的ip地址`  
[root@localhost ~]#  ifconfig ens33 | sed '2p' -n | sed 's/^.*inet//' | sed 's/net.*$//'
192.168.70.14  

[root@localhost ~]# ifconfig ens33 | sed -e "2s/^.*inet//" -n  -e "2s/net.*$//p" 
192.168.70.14  

三、awk

AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。

之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。

1,主要的作用:

用来处理文本,将文本按照指定的格式输出。其中包含了变量,循环以及数组。

2,语法

awk [option] 'pattern[action]' file ...

awk 参数 ‘条件动作’ 文件

Action指的是动作,awk擅长文本格式化,且输出格式化后的结果,因此最常用的动作就是print 和 printf

3, action动作场景

  • $0表示整行
  • $NF表示当前分割后的最后一列
  • 倒数第二列可以写成$(NF-1)
`打印所有列`
[root@localhost ~]# awk '{print $0}' /tmp/awktest.txt
xux1 xux2 xux3 xux4 xux5 
xux6 xux7 xux8 xux9 xux10 
xux11 xux12 xux13 xux14 xux15 
xux16 xux17 xux18 xux19 xux20 
xux21 xux22 xux23 xux24 xux25 
xux26 xux27 xux28 xux29 xux30 
xux31 xux32 xux33 xux34 xux35 
xux36 xux37 xux38 xux39 xux40 
xux41 xux42 xux43 xux44 xux45 
xux46 xux47 xux48 xux49 xux50

`打印第一列`
[root@localhost ~]# awk '{print $1}' /tmp/awktest.txt 
xux1
xux6
xux11
xux16
xux21
xux26
xux31
xux36
xux41
xux46

4,内置变量

NR 表示当前文件的行数
NF 表示当前文件有几列
FS 表示当前的列分隔符
RS 表示当前的行分隔符
OFS 输出字段分隔符
ORS 输出记录分隔符

[root@localhost ~]# awk 'NR==5{print $0}' /tmp/awktest.txt 
xux21 xux22 xux23 xux24 xux25 

[root@localhost ~]# awk 'NR==5, NR ==6{print $0}' /tmp/awktest.txt 
xux21 xux22 xux23 xux24 xux25 
xux26 xux27 xux28 xux29 xux30 

`打印第1-3行所有列`
[root@localhost ~]# awk 'NR==1,NR ==3{print $0}' /tmp/awktest.txt 
xux1 xux2 xux3 xux4 xux5 
xux6 xux7 xux8 xux9 xux10 
xux11 xux12 xux13 xux14 xux15

`打印行号NR`
[root@localhost ~]# awk '{print NR,$0}' /tmp/awktest.txt 
1 xux1 xux2 xux3 xux4 xux5 
2 xux6 xux7 xux8 xux9 xux10 
3 xux11 xux12 xux13 xux14 xux15 
4 xux16 xux17 xux18 xux19 xux20 
5 xux21 xux22 xux23 xux24 xux25 
6 xux26 xux27 xux28 xux29 xux30 
7 xux31 xux32 xux33 xux34 xux35 
8 xux36 xux37 xux38 xux39 xux40 
9 xux41 xux42 xux43 xux44 xux45 
10 xux46 xux47 xux48 xux49 xux50

[root@localhost ~]# awk '{print $(NF-2),$(NF-1),$NF}' /tmp/awktest.txt 
xux3 xux4 xux5
xux8 xux9 xux10
xux13 xux14 xux15
xux18 xux19 xux20
xux23 xux24 xux25
xux28 xux29 xux30
xux33 xux34 xux35
xux38 xux39 xux40
xux43 xux44 xux45
xux48 xux49 xux50

`ip地址`
[root@localhost ~]# ifconfig ens33 | awk 'NR==2{print $2}'
192.168.70.14

5, 自定义输出

​ 注意:awk,必须 外层单引号,内层双引号

​ 内置变量 $1、$2 都不得添加双引号,否则会识别为文本,尽量别加引号

`使用逗号默认空格分隔`
[root@localhost ~]#  awk '{print $1,$3,$5}' /tmp/awktest.txt  
xux1 xux3 xux5
xux6 xux8 xux10
xux11 xux13 xux15
xux16 xux18 xux20
xux21 xux23 xux25
xux26 xux28 xux30
xux31 xux33 xux35
xux36 xux38 xux40
xux41 xux43 xux45
xux46 xux48 xux50

[root@localhost ~]#  awk '{print "n1: "$1,"n2: "$3,"n3: "$5}' /tmp/awktest.txt 
n1: xux1 n2: xux3 n3: xux5
n1: xux6 n2: xux8 n3: xux10
n1: xux11 n2: xux13 n3: xux15
n1: xux16 n2: xux18 n3: xux20
n1: xux21 n2: xux23 n3: xux25
n1: xux26 n2: xux28 n3: xux30
n1: xux31 n2: xux33 n3: xux35
n1: xux36 n2: xux38 n3: xux40
n1: xux41 n2: xux43 n3: xux45
n1: xux46 n2: xux48 n3: xux50

6, 功能性参数

-F 指定分割字段符
-v 定义或修改一个awk内部的变量
-f 从脚本文件中读取awk命令
输入分隔符,awk默认是空格,空白字符,英文是field separator,变量名是FS
输出分隔符,output field separator,简称0FS

awk模式

关系运算符 含义 用法示例
< 小于 x < y
<= 小于等于 x <= y
== 等于 x == y
!= 不等于 x != y
>= 大于等于 x >= y
> 大于 x > y
~ 与对应的正则匹配则为真 x ~ /正则/
!~ 与对应的正则不匹配则为真 x !~ /正则/
`-F 自定义输入分隔符`
[root@localhost ~]# awk -F ":"  'NR==1{print $0}' /tmp/passwd.txt 
root:x:0:0:root:/root:/bin/bash
[root@localhost ~]# awk -F ":"  'NR==1{print $1}' /tmp/passwd.txt 
root

`还可以用 FS 搭配-v 使用 改变输入分隔符`
[root@localhost ~]# awk -v FS=":" 'NR==1{print $1}' /tmp/passwd.txt 
root

`使用单个逗号 输出分隔符默认是空格`
[root@localhost ~]# awk -F":" 'NR==1{print $1,$NF}' /tmp/passwd.txt 
root /bin/bash

`自定义输出分割符号`
[root@localhost ~]# awk -F":" 'NR==1{print $1,"----------",$NF}' /tmp/passwd.txt 
root ---------- /bin/bash  

`OFS 修改默认输出分隔符`
[root@localhost ~]# awk -F":" -v OFS="---------" 'NR==1{print $1,$NF}' /tmp/passwd.txt 
root---------/bin/bash 

`将输出分隔符修改为制表符`
[root@localhost ~]# awk -F":" -v OFS="\t" 'NR==1{print $1,$NF}' /tmp/passwd.txt 
root    /bin/bash

`RS 指定符号为换行符`
[root@localhost ~]# awk -v RS=' ' '{print NR,$0}' /tmp/awktest.txt
1 xux1
2 xux2
3 xux3
4 xux4
5 xux5
6 
xux6
7 xux7
8 xux8
9 xux9
10 xux10
11 
xux11

`ORS 将换行符换成自定义符号`
[root@localhost ~]# awk -v ORS='--------' '{print NR,$0}' /tmp/awktest.txt
1 xux1 xux2 xux3 xux4 xux5 --------2 xux6 xux7 xux8 xux9 xux10 --------3 xux11 xux12 xux13 xux14 xux15 --------4 xux16 xux17 xux18 xux19 xux20 --------5 xux21 xux22 xux23 xux24 xux25 --------6 xux26 xux27 xux28 xux29 xux30 --------7 xux31 xux32 xux33 xux34 xux35 --------8 xux36 xux37 xux38 xux39 xux40 --------9 xux41 xux42 xux43 xux44 xux45 --------10 xux46 xux47 xux48 xux49 xux50--------

`BEGIN模式`
[root@localhost ~]# awk 'BEGIN{print "这是begin模式"} NR==1{print NR,$0}' /tmp/awktest.txt 
这是begin模式
1 xux1 xux2 xux3 xux4 xux5 

`BEGIN模式可以不加文件; awk可以使用自定义变量`
[root@localhost ~]# awk -v name="plmm" 'BEGIN{print "我喜欢",name}'
我喜欢 plmm

`ARGV[N] 第一个是awk命令本身 第二个是文件名`
[root@localhost ~]# awk '{print ARGV[0],ARGV[1],$0}' /tmp/awktest.txt 
awk /tmp/awktest.txt xux1 xux2 xux3 xux4 xux5 
awk /tmp/awktest.txt xux6 xux7 xux8 xux9 xux10 
awk /tmp/awktest.txt xux11 xux12 xux13 xux14 xux15 
awk /tmp/awktest.txt xux16 xux17 xux18 xux19 xux20 
awk /tmp/awktest.txt xux21 xux22 xux23 xux24 xux25 
awk /tmp/awktest.txt xux26 xux27 xux28 xux29 xux30 
awk /tmp/awktest.txt xux31 xux32 xux33 xux34 xux35 
awk /tmp/awktest.txt xux36 xux37 xux38 xux39 xux40 
awk /tmp/awktest.txt xux41 xux42 xux43 xux44 xux45 
awk /tmp/awktest.txt xux46 xux47 xux48 xux49 xux50
[root@localhost ~]# awk '{print ARGV[0],ARGV[1],ARGV[2],$0}' /tmp/awktest.txt 
awk /tmp/awktest.txt  xux1 xux2 xux3 xux4 xux5 
awk /tmp/awktest.txt  xux6 xux7 xux8 xux9 xux10 
awk /tmp/awktest.txt  xux11 xux12 xux13 xux14 xux15 
awk /tmp/awktest.txt  xux16 xux17 xux18 xux19 xux20 
awk /tmp/awktest.txt  xux21 xux22 xux23 xux24 xux25 
awk /tmp/awktest.txt  xux26 xux27 xux28 xux29 xux30 
awk /tmp/awktest.txt  xux31 xux32 xux33 xux34 xux35 
awk /tmp/awktest.txt  xux36 xux37 xux38 xux39 xux40 
awk /tmp/awktest.txt  xux41 xux42 xux43 xux44 xux45 
awk /tmp/awktest.txt  xux46 xux47 xux48 xux49 xux50

`在引用外部变量`
[root@localhost ~]# what="我喜欢plmm!!!"
[root@localhost ~]# awk -v name=$what 'BEGIN{print name}'
我喜欢plmm!!!

7, print 和 printf 的区别

  • ​ printf动作默认不会添加换行符

  • ​ print 默认添加空格换行符

  • ​ printf需要指定format;

    • %d 打印单个ASCII 字符 printf("The character is %c\n",x) 输出: The character is A
      %d 打印一个十进制数 printf("The boy is %d years old\n",y) 输出:The boy is 15 years old
      %e 打印数字的e 记数法形式 printf("z is %e\n",z) 打印: z is 2.3e+0 1
      %f 打印一个浮点数 printf("z is %f\n", 2.3 * 2) 输出: z is 4.600000
      %o 打印数字的八进制 printf("y is %o\n",y) 输出:z is 17
      %s 打印一个字符串 print("The name of the culprit is %s\n",$1) 输出:The name of the culprit is Bob Smith
  • printf修饰符文章来源地址https://www.toymoban.com/news/detail-514682.html

    • -:左对齐,默认右对齐
    • +:显示数值符号;printf "%+d"
[root@localhost ~]# awk '{printf $1}' /tmp/awktest.txt 
xux1xux6xux11xux16xux21xux26xux31xux36xux41xux46[root@localhost ~]# 

`%s`
[root@localhost ~]# awk '{printf "%s\n",$1}' /tmp/awktest.txt 
xux1
xux6
xux11
xux16
xux21
xux26
xux31
xux36
xux41
xux46

[root@localhost ~]# awk '{printf "第一列 %s     第二列 %s    第三列 %s\n",$1,$2,$3}' /tmp/awktest.txt 
第一列 xux1     第二列 xux2    第三列 xux3
第一列 xux6     第二列 xux7    第三列 xux8
第一列 xux11     第二列 xux12    第三列 xux13
第一列 xux16     第二列 xux17    第三列 xux18
第一列 xux21     第二列 xux22    第三列 xux23
第一列 xux26     第二列 xux27    第三列 xux28
第一列 xux31     第二列 xux32    第三列 xux33
第一列 xux36     第二列 xux37    第三列 xux38
第一列 xux41     第二列 xux42    第三列 xux43
第一列 xux46     第二列 xux47    第三列 xux48

`%d`
[root@localhost ~]# awk 'BEGIN{printf "%d%d%d%d\n",1,2,3,4}'
1234

`- +对齐` 
[root@localhost ~]# awk '{printf "第一列 %-20s第二列 %-20s第三列 %-20s\n",$1,$2,$3}' /tmp/awktest.txt 
第一列 xux1                第二列 xux2                第三列 xux3                
第一列 xux6                第二列 xux7                第三列 xux8                
第一列 xux11               第二列 xux12               第三列 xux13               
第一列 xux16               第二列 xux17               第三列 xux18               
第一列 xux21               第二列 xux22               第三列 xux23               
第一列 xux26               第二列 xux27               第三列 xux28               
第一列 xux31               第二列 xux32               第三列 xux33               
第一列 xux36               第二列 xux37               第三列 xux38               
第一列 xux41               第二列 xux42               第三列 xux43               
第一列 xux46               第二列 xux47               第三列 xux48   

grep 练习题

`找出root开头的行`
[root@localhost ~]# grep '^root' /tmp/passwd.txt 
root:x:0:0:root:/root:/bin/bash

`匹配以root开头或者以mysql开头的行,注意定位锚点`
[root@localhost ~]# grep -E '^(root|mysql)' /etc/passwd
root:x:0:0:root:/root:/bin/bash
mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin

`过滤出除了root开头的行`
[root@localhost ~]# grep -v '^root' /etc/passwd
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

`统计root出现的次数`
[root@localhost ~]# grep 'root' /etc/passwd -c
2

`匹配test用户最多一次 -m`
[root@localhost ~]# grep '^test' /etc/passwd -m 1
test:x:1000:1000:test:/home/test:/bin/bash

`匹配多个文件,列出存在信息的文件名字`
[root@localhost ~]# grep 'test' /tmp/passwd.txt /etc/passwd /tmp/test.txt -l
/tmp/passwd.txt
/etc/passwd

`显示/etc/passwd文件中不以/bin/bash结尾的行`
[root@localhost ~]# grep -v '/bin/bash$' /tmp/passwd.txt 
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

`匹配uid和gid是2,3数字的行`
[root@localhost ~]# grep -E '\<[0-9]{2,3}\>' /tmp/passwd.txt 
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin

`找出文件中,以至少一个空白字符开头,后面是非空字符的行`
[root@localhost ~]# grep '^[[:space:]].*' /tmp/luffy2.txt 
 happy every day
[root@localhost ~]# grep '^[[:space:]]+[^[:space:]]' /tmp/luffy2.txt  -E
 happy every day
 
[root@localhost ~]# grep -E '^(root|mysql|xiao)' /tmp/passwd.txt 
root:x:0:0:root:/root:/bin/bash
xiaosang:x:1001:1001::/home/xiaosang:/bin/bash
mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin
xiao:x:555:555::/home/www:/shbin/nologin
xiao1:x:555:555::/home/www:/shbin/nologin

[root@localhost ~]# grep -E '^(root|mysql|xiao)\>' /tmp/passwd.txt 
root:x:0:0:root:/root:/bin/bash
mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin
xiao:x:555:555::/home/www:/shbin/nologin
 
`找出/etc/init.d/functions文件中的所有函数名`
[root@localhost ~]# grep -E '[a-zA-Z]+\(\)' /etc/init.d/functions 
checkpid() {
__kill_pids_term_kill_checkpids() {
__kill_pids_term_kill() {
__pids_var_run() {
__pids_pidof() {
daemon() {
killproc() {

`找出:前面字符与结尾相同的行`
[root@localhost ~]# grep -E '^([^:]+).*\1$' /tmp/passwd.txt 
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
nobody:x:99:99:Nobody:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
nginx:x:987:981:Nginx web server:/var/lib/nginx:/sbin/nologin

sed 练习题

`将开头是#符号的行和空行删除`
[root@localhost ~]# sed -e '/^$/d' -e '/^#/d' /tmp/luffy2.txt 
I teach linux.
I like c++.
happy every day
 good good study

`将文本中空行,开头是空格的行替换为#`
[root@localhost ~]# sed -e 's/^[[:space:]]/#/g' -e 's/^$/#/g' /tmp/luffy2.txt 
I teach linux.
#
I like c++.
#
happy every day
#
#good good study
#
#

`在文本前三行加上@符号` ==用了扩展正则表达式 -r,引用了原文 \1==
[root@localhost ~]# sed  -r '1,3s/(^.)|(^$)/@\1/' /tmp/luffy2.txt 
@I teach linux.
@
@I like c++.

happy every day

 good good study
 
 
`sed 取ip地址`
[root@localhost ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.70.14  netmask 255.255.255.0  broadcast 192.168.70.255
        inet6 fe80::3a93:caf:b995:b1d6  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:c0:b0:a1  txqueuelen 1000  (Ethernet)
        RX packets 13469  bytes 1208013 (1.1 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 9149  bytes 1040700 (1016.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        
[root@localhost ~]# ifconfig ens33 | sed '2s/^.*inet//;2s/netm.*//p'  -n
 192.168.70.14


`sed 找出系统版本`
[root@localhost ~]# cat /etc/centos-release
CentOS Linux release 7.9.2009 (Core)
`中括号中间^取反,+贪婪匹配,() \1 扩展正则`
[root@localhost ~]# sed -r 's/^.*release[[:space:]]//;s/([^.]+).*/\1/p' /etc/centos-release -n
7

awk练习题

`在当前系统中打印用户的用户名和家目录`
[root@localhost ~]# awk -F ":" '$3>=1000{print $1,$(NF-1)}' /tmp/passwd.txt 
nfsnobody /var/lib/nfs
test /home/test
xiaosang /home/xiaosang
biaosang /home/biaosang

`给/tmp/xuxu.txt文件的前五行,添加#号`
[root@localhost ~]# awk 'NR<6{print "#",$0}' /tmp/awktest.txt 
# xux1 xux2 xux3 xux4 xux5 
# xux6 xux7 xux8 xux9 xux10 
# xux11 xux12 xux13 xux14 xux15 
# xux16 xux17 xux18 xux19 xux20 
# xux21 xux22 xux23 xux24 xux25 

`找出/tmp/tel.txt中的电话号码`
[root@localhost ~]# cat /tmp/tel.txt 
Mike Harrington:[510] 548-1278:250:100:175

Christian Dobbins:[408] 538-2358:155:90:201

Archie McNichol:[206] 548-1348:250:100:175

Jody Savage:[206] 548-2788:15 :188:150

Dan Savage:[406] 298-7744:450:300:275

Nancy McNeil:[206] 548-1278:250:80:75

Elizabeth Stachelin:[916] 440-1763:175:75:300

[root@localhost ~]# awk -F "[ :]" '!/^$/{print $4}' /tmp/tel.txt 
548-1278
538-2358
548-1348
548-2788
298-7744
548-1278
440-1763

`找出Mike的电话号码`
[root@localhost ~]# awk -F "[ :]" '/^Mike/{print $4}' /tmp/tel.txt 
548-1278

`找出姓(第二列)以D开头 的信息 利用正则x~/正则/`
[root@localhost ~]# awk -F "[ :]" '$2~/^D/{print $0}' /tmp/tel.txt 
Christian Dobbins:[408] 538-2358:155:90:201

`打印Mike最后3行数字,并在千米那加上$`
[root@localhost ~]# awk -F "[ :]" '/^[Mike]/{print "$"$5,"$"$6,"$"$7}' /tmp/tel.txt 
$250 $100 $175

`姓名反过来,并在中间用逗号分开`
[root@localhost ~]# awk -F "[ :]" '!/^$/{print $2","$1}' /tmp/tel.txt 
Harrington,Mike
Dobbins,Christian
McNichol,Archie
Savage,Jody
Savage,Dan
McNeil,Nancy
Stachelin,Elizabeth

[root@localhost ~]# awk -F "[ :]" -v OFS=',' '!/^$/{print $2,$1}' /tmp/tel.txt 
Harrington,Mike
Dobbins,Christian
McNichol,Archie
Savage,Jody
Savage,Dan
McNeil,Nancy
Stachelin,Elizabeth

`打印非空行`
[root@localhost ~]# awk '!/^$/{print $0}' /tmp/tel.txt 
Mike Harrington:[510] 548-1278:250:100:175
Christian Dobbins:[408] 538-2358:155:90:201
Archie McNichol:[206] 548-1348:250:100:175
Jody Savage:[206] 548-2788:15 :188:150
Dan Savage:[406] 298-7744:450:300:275
Nancy McNeil:[206] 548-1278:250:80:75
Elizabeth Stachelin:[916] 440-1763:175:75:300

到了这里,关于Linux三剑客grep、sed、awk(包括练习题)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Linux中字符处理三剑客(grep sed awk )

    在 Linux 系统中,字符处理流程可以利用三个常用的工具来完成,三剑客的具体说明如下: grep:grep 是一种强大的文本搜索工具,可以搜索文件内容中包含指定文本的行,并打印出包含该文本的行。grep 命令通常用于搜索日志文件、配置文件等。 在Linux中,\\\"grep\\\"是一种文本搜索

    2024年02月08日
    浏览(45)
  • Linux 文本处理三剑客:grep、sed 和 awk

    awk、grep、sed是linux操作文本的三大利器,合称文本三剑客,也是必须掌握的linux命令之一。三者的功能都是处理文本,但侧重点各不相同,其中属awk功能最强大,但也最复杂。grep更适合单纯的查找或匹配文本,sed更适合编辑匹配到的文本,awk更适合格式化文本,对文本进行较

    2024年01月17日
    浏览(35)
  • Linux:管道命令与文本处理三剑客(grep、sed、awk)

    Linux:管道命令与文本处理三剑客(grep、sed、awk)

    众所周知,bash命令执行的时候会输出信息,但有时这些信息必须要经过几次处理之后才能得到我们想要的格式,此时应该如何处置?这就牵涉到 管道命令(pipe) 了。管道命令使用的是 | 这个界定符号。另外,管道命令与连续执行命令是不一样的,这点下面我们会说明。 我们先

    2023年04月18日
    浏览(20)
  • Linux三剑客(awk、sed、grep) 和 正则表达式

    Linux三剑客(awk、sed、grep) 和 正则表达式

    本文章适用于一定工作经验(熟悉Linux基础)的同行,欢迎各位大佬批判指正。 上手三剑客(grep,sed,awk)之前,需要熟悉正则表达式, 正则表达式 ——事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的

    2024年02月15日
    浏览(35)
  • Linux文本三剑客---awk

    Linux文本三剑客---awk

    Linux文本三剑客之一(grep,sed,awk),功能最强大的文本工具。 逐行读取输入的文本内容,默认以空格和tab键作为分隔符。但是多个空格或者tab键的空格,会自动压缩成一个,然后按照指定的模式和条件执行编辑命令 可以在免交互的情况下,实现复杂的文本操作。完成自动化配

    2024年02月07日
    浏览(33)
  • Linux:文本三剑客之awk

    Linux:文本三剑客之awk

    awk:是一种 处理文本文件的语言 ,是一个强大的 文本分析工具 。 awk: 逐行读取文本 ,默认以 空格 或 tab键 为分隔符 进行分隔 ,将分隔所得的 各个字段 保存到 内建变量 中,并按模式或者条件执行编辑命令。 1、sed命令常用于一整行的处理,而awk比较 倾向于将一行分成

    2024年02月05日
    浏览(30)
  • Linux 三剑客命令之 awk 详解

    Linux 三剑客命令之 awk 详解

    目录 一、Awk 实战讲解 1.1 awk 的原理 1.2 BEGIN 和 END 模块 1.3 运算符 1.4 常用 awk 内置变量 1.5 awk 正则 1.6 awk 常用字符串函数         awk 是一种很棒的语言,它适合文本处理和报表生成,其语法较为常见,借鉴了某些语言的一些精华,如 C 语言等。在 linux 系统日常处理工作中

    2024年02月03日
    浏览(197)
  • Linux三剑客——Linux grep命令详解:查找文件内容

    很多时候,我们并不需要列出文件的全部内容,而是从文件中找到包含指定信息的那些行,要实现这个目的,可以使用 grep 命令。 grep 命令 作为 Linux 文本处理三剑客的一员,另外两个是 sed 和 awk ,我们会在后面的文章中作详细介绍。 grep 命令 的由来可以追溯到 UNIX 诞生的

    2024年02月11日
    浏览(27)
  • Linux系统三剑客之grep和正则表达式的介绍(一)

    Linux系统三剑客之grep和正则表达式的介绍(一)

    1.正则表达式 目录 1.正则表达式 1.什么是正则表达式 ? 2.正则表达式的使用场景 3.正则表达式字符表示 4.它们之间的区别 2.grep命令 作用: 语法: 说明: 选项:options 重点 实例 3.后面的下次再更新。  1.什么是正则表达式 ? 一个正则表达式就是描述了一个字符串集合的方式

    2024年01月18日
    浏览(44)
  • linux中shell脚本——shell数组、正则表达式及文件三剑客之AWK

    linux中shell脚本——shell数组、正则表达式及文件三剑客之AWK

    目录 一.shell数组 1.1.数组分类 1.2.定义数组方法 二.正则表达式 2.1.元字符 2.2.表示次数 2.3.位置锚定 2.4.分组 2.5.扩展正则表达式 三.文本三剑客之AWK 3.1.awk介绍及使用格式 3.2.处理动作 3.3.awk选项 3.4.awk处理模式 2.5.awk常见的内置变量  2.6.if条件判断 1.1.数组分类 ①关联数组:必

    2024年02月12日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包