Linux之shell学习(三)——文本处理三剑客grep、sed、awk

1、grep

1.grep的格式

grep 匹配条件 处理文件

例如:

grep root /etc/passwd	##在/etc/passwd全局搜索含有‘root’关键字的内容
grep ^root /etc/passwd	##在/etc/passwd全局搜索含有‘root’,且‘root’开头
grep root$ /etc/passwd	##在/etc/passwd全局搜索含有‘root’,且‘root’结尾
grep -i root /etc/passwd	##在/etc/passwd全局搜索含有‘root’,且不区分
grep -E "root|ROOT" /etc/passwd	##在/etc/passwd

2.grep中的正则表达式

^hello	##以hello开头
hello$	##以hello结尾
'h....o' ##'h开头,o结尾,中间4个字符'
'h.....' ##'h开头,后面5个字符'
'.....o' ##'o结尾,前面5个字符'

3.grep中字符的匹配次数设定

         *       字符出现 [0-任意次 ]
         \?      字符出现 [ 0-1次   ]
         \+      字符出现 [ 1-任意次]
         \{n\}   字符出现 [ n次 ] 
         \{m,n}  字符出现 [ 最少出现m次,最多出现n次]
         \{0,n\} 字符出现 [ 0-n次]
         \{m,\}  字符出现 [ 至少m次]
         \(xy\)\{n\}xy   关键字出现[n次]
         .*      关键字之间匹配任意字符

2、sed

sed 命令格式
调用sed命令有两种形式:

	sed[option]'command' file(s)
	sed[option] -f scriptfile file(s)

sed对字符的处理

p 显示
d 删除
a 添加
c 替换
w 写入
i 插入

1.p模式操作

sed -n '/\:/p' fstab	##显示有:的行的内容
sed -n '/UUID$/P' fstab ##显示UUID结尾的行的内容
sed -n '/^UUID/P' fstab ##显示UUID开头的行的内容
sed -n '2,6p' fstab 	##显示第二行到第六行的内容
sed -n '2,6!p' fstab 	##显示除了2-6行都显示

2.d模式操作

sed '/^UUID/d' /etc/fstab  ##删除UUID开头的行的内容
sed '/^#/d' /etc/fstab	   ##删除#开头的行的内容
sed '/^$/d' /etc/fstab	   ##删除空行
sed '1,4d' /etc/fstab 	   ##删除1-4行的内容
sed '/^UUID/!d' /etc/fstab ##删除除UUID开头外的行的内容

3.a模式操作

sed '/^UUID/ahello linux' fstab 	##在UUID开头的行的后添加‘hello linux’
sed '/^UUID/ahello\nlinux' fstab 	##在UUID开头的行的后面添加‘hello\nlinux’

4.i模式操作

sed '/^UUID/ihello\nlinux' fstab	##在UUID开头的行的前面添加‘hello\nlinux’

5.w模式操作

sed '/^#/w /mnt/testfile' fstab		##将fstab中以#为开头的行整合到/mnt/testfile中
sed -n '/^#/w /mnt/testfile' fstab	##不显示
sed '6r/mnt/linux' fstab		##将/mnt/linux中的所有内容整合到fstab的第六行中

6.c模式操作

sed '/^#/chello\nlinux' fstab		##将#开头的行的内容用‘hello\nlinux’替换

sed的其他用法

sed 'G' data		##在每行行后插入一个空白行
sed '$!G' data		##在除最后一行外的每行行后插入一个空白行
sed '=' data | sed 'N;s/\n//'	##每行行前添加行号
sed -n '$p' data	##显示最后一行

3、awk

报告生成器
awk处理机制:awk会逐行处理文本,支持在处理第一行之前做一些准备工作,以及在处理完最后一行做一些总结性质的工作,在命令格式上分别体现以下:

BEGIN{}:读入第一行文本之前执行,一般用来初始化操作
{}:逐行处理,逐行读入文本执行相应的处理,是最常见的编辑指令
END{}:处理完最后一行文本之后执行,一般用来输出处理结果
awk -F : 'BEGIN{print "hello"}{print $1}END{print "end"}' /etc/passwd
#在/etc/passwd文件逐行打印每一行第一列的内容,并在首行添加‘hello’,行尾添加‘end’
awk -F : '{print FILENAME}' /etc/passwd
#在/etc/passwd文件逐行打印‘/etc/passwd’,并处理总行数次
awk -F : '{print NR}' /etc/passwd
#打印‘/etc/passwd’的行号
awk -F : '{print NF}' /etc/passwd
#打印‘/etc/passwd’的列号,并处理总行数次
awk -F : 'BEGIN{print "NAME"}'
#在开始处理文本时,打印‘NAME’
awk -F : '/bash$/{print $1}' /etc/passwd

awk -F : '{ print $1}' /etc/passwd

awk -F : '/bash$/{ print $1}' /etc/passwd

awk -F : '!/bash$/{ print $1}' /etc/passwd

awk -F : 'BEGIN{n=0}/bash$/{n++}END{print n}' /etc/passwd 

awk '/[a-d]/{print}' /etc/passwd

awk '/^[a-d]/{print}' /etc/passwd

awk '!/^[a-d]/{print}' /etc/passwd

awk '!/^[^a-d]/{print}' /etc/passwd

awk '/^a|bash$/{print}' /etc/passwd

awk '!/^a|bash$/{print}' /etc/passwd

awk '/!^a|bash$/{print}' /etc/passwd

awk -F : '$6~/bin$/' /etc/passwd

awk -F : '$6~/\ /etc/passwd

awk -F : '$6!~/^\/home/{print $1}' /etc/passwd

awk -F : '$6!~/^\/home/&&/bash$/{print $1}' /etc/passwd

ifconfig eth0 | awk  '/inet\>/{print $2}'

#find #

-name
-type
-perm
-c 默认是天
find /etc -name passwd
find /etc -maxdepth 1 -name passwd  ##查找深度
find /etc -mindepth 2 -name passwd
find /mnt/ -group student
find /mnt/ -user student -o -group student
find /mnt/ -user root -a -group student
find /mnt/ -size +20k -exec rm -fr {} \; ##找到大于20k的文件并删除

-cmin 小于x分钟

ugo必须包含所写条件
企业7以后是/
企业7之前是+

 find /etc/ -type l  ##查找/etc下链接型的文件
 find /etc/ -ctime -10 ##时间小于10天
 find /etc/ -ctime +10  ##大于10天

 find /etc/ -cmin  +/-10 ##10分钟
 find /etc/ -cmin   10

你可能感兴趣的:(shell)