awk、grep、sed 三大文本编辑工具

1. grep

1.1 grep 简介

      grep是一款文本过滤工具。根据用户指定的 “模式” 对目标文本逐行进行匹配检查,打印匹配到的行。,

1.2 正则表达式简介

正则表达式分为两类:
      基本正则表达式:BRE
      扩展正则表达式:ERE

1.2.1 基本正则表达式

字符匹配:

.	:匹配任意单个字符
[]	:匹配指定范围内的任意单个字符,如 [0-9] 表示匹配 0-9 的任意单个字符
[^]	:匹配指定范围外的任意单个字符

以上[]当中还有以下几种表示方法:
[:alnum:]	#表示所有的字母和数字
[:alpha:]	#表示所有的字母(不区分大小写)
[:digit:]	#表示所有的数字
[:lower:]	#表示所有的小写字母
[:upper:]	#表示所有的大写字母
[:punct:]	#表示所有的标点符号
[:space:]	#表示所有的空白字符

次数匹配:
      用于在要指定次数的字符后面,用于指定前面的字符要出现的次数。

 1. :匹配前面的字符任意次(0次1次或多次)
.*	:任意长度的任意字符
\?	:匹配前面的字符0次或1次
\+	:匹配前面的字符至少1次
\{m\}	:匹配前面的字符m次
\{m,n\}	:匹配前面的字符至少m次,至多n次
\{0,n\}	:匹配前面的字符至多n次(0-n)
\{m,\}	:匹配前面的字符至少m次(m-MAX)

位置锚定:
      对特殊位置进行定位。

^	:行首锚定
$	:行尾锚定
^PATTERN$	:用于模式匹配整行,如 ^$ 表示空行
\< or \b	:词首锚定
\> or \b	:词尾锚定
\<PATTERN\>	:匹配整个单词

1.2.2 扩展正则表达式

字符匹配:同基本正则表达式
次数匹配:

 2. :匹配前面的字符任意次(0次1次或多次)
.*	:任意长度的任意字符
?	:匹配前面的字符0次或1次
|	:或,如 cou(n|N)t
 3. :匹配前面的字符至少1次
{m}	:匹配前面的字符m次
{m,n}	:匹配前面的字符至少m次,至多n次
{0,n}	:匹配前面的字符至多n次(0-n)
{m,}	:匹配前面的字符至少m次(m-MAX)

位置锚定:同基本正则表达式

1.3 grep 参数解析

语法:
      grep [OPTIONS] PATTERN [FILE…]
      grep [OPTIONS] [-e PATTERN | -f FILE] [FILE…]

1. 默认参数: --color=auto

[root@study ~]# alias grep
alias grep='grep --color=auto'	#对匹配到的文本高亮显示

2. -v 反向选择

grep -v "mail" grep.txt 	#不显示包含mail的行

3. -n 显示行号

grep -n "uucp" grep.txt 	#显示匹配到uucp的行号

4. -c 显示匹配的行数

grep -c "sbin" grep.txt		#显示匹配到的总行数

5. -i 不区分大小写

grep -i "mail" grep.txt 	

6. -w 精确匹配

grep -w "bin" grep.txt  	#此时包含sbin的行不会被查找
grep "\<bin\>" grep.txt		#效果同上

7. -o 仅显示匹配到的字符串本身

grep -o "mail" grep.txt 	#仅显示匹配到的mail

8. -q 静默模式

grep -q "mail" grep.txt 	#无输出,用于$?判断

9. -A :after,除了显示匹配行,还会显示该行下面的内容

grep -A 1 "mail" grep.txt	#标准输出查找到的行及其下一行

10. -B :before,除了显示匹配行,还会显示该行上面的内容

grep -B 1 "mail" grep.txt 	#标准输出查找到的行及其上一行

11. -C :-A和-B同时显示

grep -C 1 "mail" grep.txt 	#显示匹配行及其上下一行

12. -E 支持扩展正则表达式

grep -E 同 egrep

1.4 grep 实例解析

1. 显示 /proc/meminfo 文件中以大写S或小写s开头的行。

grep -i '^s' /proc/meminfo
grep '^[Ss]' /proc/meminfo
grep -E '^(S|s)' /proc/meminfo

2. 显示 /etc/passwd 文件中其默认shell为非 /sbin/nologin 的用户。

grep -v "/sbin/nologin$" /etc/passwd | cut -d: -f1

3. 显示/etc/passwd 文件中默认 shell 为/bin/bash 的用户,且仅显示ID号最大的用户。

grep "/bin/bash$" /etc/passwd | sort -t: -k3 -nr | head -1 | cut -d: -f1

4. 找出/etc/passwd文件中的一位数或者两位数。

grep "\<[0-9][0-9]\?\>" /etc/passwd
grep -E "\<[0-9][0-9]?\>" /etc/passwd
grep -E "\<[0-9]{1,2}\>" /etc/passwd

5. 找出ifconfig命令中的所有ip地址。

ifconfig | grep -o -E "([0-9]\.|[1-9][0-9]\.|1[0-9][0-9]\.|2[0-9][0-9]\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-9]{2})"

6. 找出/etc/rc.d/init.d/functions 文件中某单词后跟一组"()"的行。

grep -E "\<[[:alnum:]]+\>\(\)"  /etc/rc.d/init.d/functions

2. sed

2.1 sed 简介

      sed是一种在线编辑器、行编辑器,一次处理一行内容,在处理时把当前处理的行存储在临时缓冲区当中,该缓冲区成为"模式空间(pattern space)",接着用sed命令处理缓冲区中的内容。处理完毕后,将缓冲区的内容送到标准输出,然后接着去处理下一行,重复完成相同的操作,直至文件末尾。sed处理的整个过程中,对象文件中的内容并没有改变,除非使用重定向来存储处理后的结果。sed主要用来自动编辑一个或多个文件,简化对文件的反复操作过程。

2.2 sed 参数解析

语法:
      sed [OPTION]… {script-only-if-no-other-script} [input-file]…

1. -r 支持扩展正则表达式

sed默认支持基本正则表达式,-r 支持扩展正则表达式 

2. -n 静默模式

sed -n '1p' sed.txt 	#只会输出sed.txt的第一行;默认会将匹配的行先输出,然后将全文输出

3. -e 多个命令组合,对文件内容执行多条sed命令条件

sed -ne '1p' -e '3p' sed.txt 		#只输出sed.txt的第一行和第三行

4. -f /PATH/SCRIPT_FILE 从指定的文件中读取脚本并运行

5. -i 把sed命令修改的结果直接写入到文件,一般用来编辑文件内指定内容,屏幕不输出内容

sed -i '/bash/s/bin/sbin/g' sed.txt 	#将文件中匹配到 bash 的行中的 bin 字符全部换为 sbin

6. a:add 在匹配的当前行的下一行添加内容

sed '/hello/aworld' sed.txt 	#在匹配带hello行的下一行添加world

7. i:insert 在匹配的当前行的上一行添加内容

sed '/hello/iworld' sed.txt 	#在匹配带hello行的上一行添加world

8. &:在当前行匹配字符串尾添加字符串

sed 's/world/&world/' sed.txt 	#在匹配到 hello 的尾部添加world

9. c:把该行替换成c后面的字符串

sed '2,4c hello world' sed.txt 	#2-4行的全部内容替换成"hello world"一行

10. s:旧字符替换新字符,行数s/旧字符串/新字符串/g;s///,s###,s@@@

sed 's/than/hello/' sed.txt 	#将每行匹配到的第一个 than 换为 hello
sed 's/than/hello/g' sed.txt	#将每行匹配到的所有 than 换为 hello
sed '2s/than/hahaha/' sed.txt 	#匹配第二行
sed '2,4s/than/hahaha/' sed.txt #匹配第二行到第四行
sed '/by/s/^/hello/' sed.txt    #在包含by行的头加上hello
sed '/Beautiful/s/than/hahaxha/' sed.txt 	#在匹配到有Beautiful的行,第一个than换位hahaha
sed '/Beautiful/s/than/hahahah/g' sed.txt 	#在匹配到有Beautiful的行,所有than换位hahaha

11. p:标准输出

sed -n '1,3p' sed.txt  	#显示1-3行的内容
sed -n '2p;$p' sed.txt	#显示第二行和最后一行的内容,中间用分号隔开,多行可以sed -n '2p;3p;$p' sed

12. d:删除

sed '1d' sed.txt    	#删除第1行
sed '2,3d' sed.txt  	#删除第2-3行
sed '2d;$d' sed.txt		#删除第2行和最后1行

13. w /PATH/FILE:将指定的内容另存至 /PATH/FILE所指定的文件中

sed -n '1,5w sed.txt' test.txt 	#将sed.txt中的1-5行另存至test.txt文件中

14. 特殊用法

sed -n '1~2{cmd}'   	#1、3、5、7 ...行执行cmd命令
sed -n '2~2{cmd}'   	#2、4、6、8 ...行执行cmd命令
sed '1,+10{cmd}' 		#1-11行执行cmd命令

2.3 sed 实例解析

1. 删除 /tmp/grub.conf 文件中所有行的行首的空白字符。

sed 's#^[[:space:]]\+##' /tmp/grub.conf

2. 删除 /etc/fstab 文件中所有以#号开头,且至少跟有一个空白字符的行的行首的#号和空白字符。

sed 's@^#[[:space:]]\+@@' /etc/fstab
sed -r 's@^#[[:space:]]+@@' /etc/fstab

3. 把 /etc/fstab 文件的奇数行另存为 /tmp/test.txt。

sed -n '1~3w /etc/test.txt' /tmp/fstab

3. awk

3.1 awk简介

      Linux文本处理工具三剑客:grep、sed、awk。其中grep是文本过滤工具,sed是文本行编辑器,而awk是一种报表生成器,就是对文件进行格式化处理的,这里的格式化不是文件系统的格式化,而是对文件内容进行各种"排版",进而格式化显示。
      在Linux上我们使用的是GNU awk 简称 gawk,gawk 其实就是 awk 的链接文件,因此在系统上使用 awk 和 gawk是一样的。gawk是一种过程式编程语言。gawk还支持条件判断、数组、循环等各种编程语言中所有可以使用的语言,因此我们还可以把 gawk 称为一种脚本语言解释器。

3.2 awk 参数解析

语法:
      awk [OPTIONS] ‘program’ FILE1 …

1. $0,$1/$2…

$0:				#显示所有内容
$1/$2.../$n 	#分别代表当前行的第一列/第二列/第三列…/第n列字段 

2. -F

指定分隔符,默认是空格或[TAB]

3. 变量
      变量分为内建变量和自定义变量。

内置变量:
	FS	:输出字段分隔符,默认为空白。如:-v FS=[:]  同 -F:
	RS	:输入时的行分隔符,默认为换行符。
	OFS	:输出时的字段分隔符,默认为空白字符。如:awk 'BEGIN{FS=":";OFS=":"}{print $3,$4}' /etc/passwd
	ORS	:输出的行分隔符,默认为换行符。
	NF	:当前行的字段数。
		print NF  :显示当前行的字段数
		print $NF : 显示当前行的最后一个字段
	NR	:文件行数
	FNR	:行数,各文件单独计数
自定义变量:
	(1) -v VAR_VALUE=VALUE 变量名区分大小写
		如:awk -F: -v val="1" '{print $val}' /etc/passwd
	(2) 在'program'中定义变量
		如:awk 'BEGIN{FS=":";num=3}{print $num}' /etc/passwd

4. print:awk的输出命令之一

语法:print item1,item2,...
	item:字符串,用引号引用
		print "hello","world"
	变量:显示变量的值,可以直接使用变量名进行引用
		print var_name**
实例:
	awk '{print}' awk.txt		#输出整行
	awk '{print $0}' awk.txt 	#输出整行
	awk '{print $1,$3}' awk.txt #输出每行的第1和第3个字段,每个字段需用","隔开
	awk -F: '{print $NF}' /etc/passwd #以":"为分隔符,输出/etc/passwd最后一个字段 
注意:
	(1) 各item之间需要使用逗号分隔,而输出时的分隔符默认为空白字符。
	(2) 输出的各 item 可以为字符串或数值、当前记录的字段($#)、变量或awk的表达式。数值会被隐式转换为字符串进行输出。
	(3) print 后面的item 有省略时,相当于运行"print $0",用于输出整行。
	(4) 输出空白字符:print " " 。

5. printf:awk的输出命令之二

语法:printf FORMAT,item1,item2,...
	要点:
	(1) 必须提供FORMAT
	(2) 与print不同,printf不会自动换行,需要显示指定换行符:\n
	(3) FORMAT 中需要额分别为后面的每个item指定一个格式符,否则item无法显示
格式符:
	%c	:显示一个字符	
	%d,%i:显示为10进制整数
	%f	:显示为浮点数
	%s	:显示为字符串
	%u	:显示无符号整数
	%%	:显示%
实例:
	awk -F: '{printf "user:%s\n",$1}' /etc/passwd  	#输出第一列,且在输出前加上user:
	awk -F: '{printf "user:%s,UID:%d\n",$1,$3}' /etc/passwd

6. awk的操作符

算数操作符:实现一些算数运算,如:x+y,x-y,x*y,x/y,x^y,x%y
	-x:负值
	+x:转换为数值
字符操作符:字符串连接
赋值操作符:通常为变量的赋值
	=,+=,-=,*=,/=,%=,^=,++,--
比较操作符:
	>,>=,<,<=,==,!=
模式匹配操作符:根据右侧的模式进行匹配操作
	~	:是否能由右侧指定的模式所匹配
	!~	:是否不能由右侧指定的模式所匹配
逻辑操作符:
	&&:与运算
	||:或运算
条件表达式:
	selector?if-true-expression:if-false-expression

7. PATTERN模式

选择对哪些内容进行处理。
(1) empty	:空模式,匹配所有行,默认为此模式
(2) /regular expression/:匹配到的行才进行操作
	如:awk -F: '/^[ab]/{prin $1}' /etc/passwd 	#以ab开头的行才被处理
(3) relationl expression:关系表达式
	如:awk -F: '$3>=1000{print $1}' /etc/passwd #uid大于1000的行才被处理
(4) BEGIN/END:两个特殊模式
	BEGIN:在文件格式化操作开始之前事先执行的一次操作,通常用于输出表头或作出一个预处理操作。
	END:在文件格式操作完成之后,命令退出之前执行的一次操作,通常用于输出表尾或做出清理操作。

8. 控制语句

if-else:
语法:if(condition) {statements} [else {statements}]
实例:
	awk -F: '{if($3>=1000) print $1}' /etc/passwd
	awk -F: '{if($3>=1000) {print $1,"is a common user."} else {print $1,"is a sysadmin or sysuser."}}' /etc/passwd
while:
语法:while (condition) {statements}
实例:
	awk '{i=1;while(i<=NF){if(length($1)>=6) {print $i};i++}}' /etc/issue
for:
语法:
	for(expr1;expr2;expr3) {statement}
	for(var in array) {for-body}
实例:
	awk '{for(i=1;i<=NF;i++) {if(length($i)>=6) print $i}}' /etc/issue 

9. 数组

关联数组:array[index-expression]
	index-expression:可以使用任意字符

10. 函数

函数分为内建函数和用户自定义函数
内建函数:
	rand()	:返回0至1之间的一个随机数
	length([s])	:返回指定的字符串的长度
	sub(r,s[,t]):基于r所表示的模式来匹配字符串t中的内容,将其第一次被匹配到的内容替换为s所表示的字符串
	gsub(r,s[,t]):基于r所表示的模式来匹配字符串t中的内容,将其所有被匹配到的内容替换为s所表示的字符串
	split(s,a[,r]):以r为分隔符去切割字符串s,并将切割后的结果保存至a表示的数组中
注:awk数组的下表从1开始编号,而非0.

3.3 awk实例解析

1. 统计当前系统上所有tcp连接的各种状态的个数。

ss -tan | awk '!/^State/{state[$1]++}END{for(i in state) print i,state[i]}'

2. 统计指定的web访问日志中各ip的资源访问次数。

awk '{ip[$1]++}END{for(addr in ip) print addr,ip[addr]}' /var/log/httpd/access_log

4. 脚本常用命令

4.1 find

语法:find 查找目录 -[OPTIONS] [-print] [-exec -ok command] {} \;
1. -name

find . -name four   	#查找名为four的文件(包括目录和文件)
find . -name "fou*" 	#查找开头是fou的文件
find . -name "[A-Z]*"   #查找大写字母开头的文件
find . -name "*.txt"    #查找以.txt结尾的文件

2. -user

find . -user lee    	#查找属主为lee的文件

3. -group

find . -group lee   	#查找属组为lee的文件

4. -type

find . -type d   		#查找文件类型为目录的文件,除了d,还有f,b,c,p,l,s,分别指普通文件,块设备,字符设备,管道,链接文件和socket套接字
find . ! -type f  		#查找非普通文件的文件,符号!表示反向选择

5. -size

find . -size 10M    	#查找大小大于10M的文件,+n表示大于nM的文件,-n表示大小小于nM的文件

6. -perm

find . -perm 600    #查找执行权限为600的文件
find . -perm -007   #查找777权限的文件,与-perm 777一样效果,+222表示文件权限在222以上

7. -mtime -atime -ctime

find . -mtime 2    	#查找文件内容修改在两天前的文件,n代表n天前的当天,-n代表n天以内,+n代表n天以前
find . -atime 2     #查找2天前被访问过的文件,n表示n天前当天被访问过,-n表示n天以内被访问过,+n表示n天以前被访问过的
find . -ctime +4    #查找4天以前文件状态被修改的文件,比如改了文件权限等,-n表示n天以内文件状态有变过,+n表示n天以前文件状态被改
-mmin/-amin/-cmin与上面类似,只是单位变成了分钟

8. -maxdepth 只在当前文件夹这一级来搜索,而不去递归向下搜索

find . -maxdepth 1 -name four   #在当前目录下找名为four的,不去子目录下找
find . -maxdepth 1 -type f  	#注意maxdepth的位置要在前面
find . -maxdepth 1 -size +100M -exec ls -lh {} \;  #找到文件并执行 ls -lh

9. -a、-o、-not、!

find . -name "four*" -a -type d #同时满足

10. -exec表示对搜索到的每个文件执行指定的命令,-ok 需要有用户进行确认

{}		#表示搜索到的每个文件 
\;		#表示命令的结束,为避免转义故在;前加符号\ 

find . -name "*.txt" -type f -exec cp {} /tmp \;   #查找.txt结尾的普通文件并复制到tmp目录下
find . -name "[A-Z]*" | xargs chmod 600 -R  	#查找大写字母开头的文件及子文件并把权限设置为600.

注:find传递查找到的文件路径至后面的命令时,是先查找出所有符合条件的文件路径,并一次性的 传递给后面的命令;但是有些命令不能接受过长的参数,此时命令执行会失败;另一种方法可避免此问题
   find | xargs COMMAND

4.2 wc

语法:wc [OPTION]… [FILE]…

-l	:统计行数
-w	:统计单词数
-c	:统计字节数

4.3 cut

语法:cut OPTION… [FILE]…

-d:默认空格为分隔符,可指定
-f:挑选出的字段	
	1 第一个字段
	1-3 123字段
	1,5 15字段

4.4 sort

-t:指定分隔符,默认排第一列字符排序
-k:用于排序的字段
-n:基于数值大小进行排序
-r:逆序排序
-f:忽略字符大小写
-u:重复的行只保留一份

4.5 uniq

-c:对重复的行计数
-u:只显示未重复的行
-d:只显示重复的行

      这篇文章就介绍到这里了,本人运维小菜鸟一枚,有什么错误请大家指出,共同进步。

猜你喜欢

转载自blog.csdn.net/rightlzc/article/details/83657237