目录
一、grep
(一)作用
(二)格式
(三)选项
(四)案例
1、查看/etc目录下所有包含bash的文件名:grep -rl bash /etc
2、查看/var/log目录下所有包含error的文件名:grep -rl error /var/log
(五)egrep(完美支持正则表达式)
(六)正则表达式
1、基础正则
2、扩展正则
(七)常见正则表达式
1、数字
2、字符串
3、Email
4、Url
5、IP
6、Tel
7、日期校验
二、find
(一)作用
(二)格式
(三)选项
1、-name 按照文件名查找
2、-size 按照文件大小查找
3、-type 按照文件类型查找
4、按照时间查找
5、按照文件归属查找
6、-perm 按照权限查找
7、-exec 用于在找到的每个文件上执行一个命令。
8、xargs命令用于从标准输入中读取字符串,并将其作为命令行参数传递给指定的命令。
xargs命令可以同时处理多个文件,因此比使用-exec选项的方式效率更高。
9、当前目录及子目录下查找所有以.txt和.pdf结尾的文件
10、找出/home下不是以.txt结尾的文件
11、找出比file.log修改时间更长的所有文件
12、删除当前目录下所有.txt文件
三、sed
(一)语法
(二)选项
(三)操作
(四)案例
1、输出符合条件的文本:
2.删除符合条件的文本
3.替换符合条件的文本
4.迁移符合条件的文本
5.使用脚本编辑文件内容
6.以上修改想要直接修改文本源文件,只需要加入选项"-i"
四、awk
(一)语法
(二)选项
(三)内建变量
(四)案例
1、按行输出
2、按段输出
3、调用shell命令
打印匹配指定字符串的行
grep [选项] [字符串] 文件名
1、-n 显示行号
2、-i 忽略大小写
3、-q 静默模式
4、-o 只显示查找的字符串
5、-v 反向匹配
6、^字符串 匹配以字符串开头的行
7、字符串$ 匹配以字符串结尾的行
8、^$ 匹配空行
9、-A # 查看所在行的后#行
10、-B # 查看所在行的前#行
11、-C # 查看所在行的前后#行
12、-r 递归扫描指定目录下的每一个文件
13、-l 只显示匹配到指定关键字的文件名,而不是文件内容
①查找特定字符
命令:cat test.txt | grep -n 'was'
②利用[]查找集合字符
命令:cat test.txt | grep -n 'sh[io]rt' 匹配i或者o
cat test.txt | grep -n '[^w]' 排除w,但以w开头的单词还会匹配到
cat test.txt | grep -n '[a-h]oo'
cat test.txt | grep -n '[0-9]'
③查找行首"^"与行尾"$"
命令:cat test.txt | grep -n '^[A-Z]'
cat test.txt | grep '\.$' \为转义符
④查找任意一个字符"."与重复字符"*"
命令:cat test.txt | grep -n 'w..d' 'w..d' 会匹配以 w 开始,以 d 结尾,中间有且仅有两个任意字符的字符串。
cat test.txt | grep -n 'ooo*' *表示前一个字符为0个或多个时满足条件
在正则表达式中, . 表示匹配除换行符之外的任何一个字符,而 .. 表示匹配任意两个字符
⑤查找连续的字符范围"{}",需要使用转义符,"\{\}"
命令:cat test.txt | grep -n 'o\{2\}'
cat test.txt | grep -n 'wo\{2,5\}d'
cat test.txt | grep -n 'wo\{2,\}d
\{n,m\} 表示匹配前面的字符至少出现 n 次,最多出现 m 次,其中 n 和 m 都是整数,可以省略不写
\{n\} 表示匹配前面的字符恰好出现 n 次
①+,重复一个或一个以上的前一个字符
命令:cat test.txt | grep -nE 'wo+d' 或者cat test.txt | egrep -n 'wo+d'
②?,零个或者一个前一个字符
命令:cat test.txt | egrep -n 'bes?t'
③|,使用或者的方式找出多个字符
命令:cat test.txt | egrep -n 'of|is|on'
④(),查找组字符串
命令:cat test.txt | egrep -n 't(a|e)st'
⑤()+,辨别多个重复的组
命令:cat test.txt | egrep -n 'A(xyz)+C'
①“^[0-9]*[1-9][0-9]*$” //正整数
②“^((-\d+)|(0+))$” //非正整数(负整数 + 0)
③“^-[0-9]*[1-9][0-9]*$” //负整数
④“^-?\d+$” //整数
⑤“^\d+(\.\d+)?$” //非负浮点数(正浮点数 + 0)
⑥“^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$” //正浮点数
⑦“^((-\d+(\.\d+)?)|(0+(\.0+)?))$” //非正浮点数(负浮点数 + 0)
⑧“^(-?\d+)(\.\d+)?$” //浮点数
①“^[A-Z]+$” //由26个英文字母的大写组成的字符串
②“^[a-z]+$” //由26个英文字母的小写组成的字符串
③“^[A-Za-z0-9]+$” //由数字和26个英文字母组成的字符串
④“^\w+$” //由数字、26个英文字母或者下划线组成的字符串
①“^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$” //email地址
②“^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$” //Email
“^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$” //url
“^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$” //IP地址
/^((\+?[0-9]{2,4}\-[0-9]{3,4}\-)|([0-9]{3,4}\-))?([0-9]{7,8})(\-[0-9]+)?$/ //电话号码
① /^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/ // 年-月-日 yyyy-MM-dd / yy-MM-dd 格式
② "^[0-9]{4}-((0([1-9]{1}))|(1[1|2]))-(([0-2]([0-9]{1}))|(3[0|1]))$" // 年-月- 日 yyyy-MM-dd 格式
③ /^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/ // 月/日/年
递归的在目录中查找文件
find 查找范围 选项 条件
①+ 数值 表示大于
②- 数值 表示小于
①f 普通文件
②s 套接字文件
③b 块设备文件
④c 字符设备文件
⑤p 管道文件
⑥l 链接文件
⑦d 目录
①atime 文件访问时间
②mtime 文件内容修改时间
③ctime 文件状态修改时间
使用stat 文件名查看文件的时间戳
①-user 按照属主查找
②-group 按照属组查找
举例:find /etc/ -perm 600
find /etc/ -user root -perm 600
举例:find /var/spool/mail -type f -exec rm -rf {} \;
表示将在/var/spool/mail目录下查找所有类型为文件的对象,并删除它们,从而清空该目录
rm -rf {}表示要删除找到的文件或目录 {}表示当前查到的文件名 \;表示执行结束并退出
举例:find /var/spool/mail -type f | xargs rm -rf
将在/var/spool/mail目录下查找所有类型为文件的对象,并将它们作为参数传递给rm -rf命令,以删除这些文件。
方法一:find . \( -name "*.txt" -o -name "*.pdf" \)
方法二:find . -name "*.txt" -o -name "*.pdf"
命令:find /home ! -name "*.txt"
命令:find . -type f -newer file.log
命令:find . -type f -name "*.txt" -delete
sed [选项] '操作' 参数
sed [选项] -f scriptfile 参数
①-e:表示用指定命令或脚本处理
②-f:指定脚本文件
③-h:帮助
④-n:表示仅显示处理后的结果
⑤-i:直接编辑文本文件
⑥-r:支持扩展正则
1、a:增加,在当前行下面以行增加指定内容
2、c:替换,将选定行替换
3、d:删除,删除指定行
举例:
①删除空白行 sed '/^$/d' file
②删除文件的第2行 sed '2d' file
③删除文件的第2行到末尾所有行 sed '2,$d' file
④删除文件最后一行 sed '$d' file
⑤删除文件中所有开头是test的行 sed '/^test/'d file
4、i:插入,在选定行的上面插入一行
5、p:打印
举例:
所有在模板test和check所确定的范围内的行都被打印 sed -n '/test/,/check/p' file
打印从第5行开始到第一个包含以test开始的行之间的所有行 sed -n '5,/^test/p' file
对于模板test和west之间的行,每行的末尾用字符串aaa bbb替换 sed '/test/,/west/s/$/aaa bbb/' file
6、s:替换,替换指定字符
7、y:字符转换
①sed -n 'p' test.txt #相当于cat
②sed -n '3p' test.txt #打印第3行
③sed -n ‘/w/p' test.txt #打印所有包含字符"w"的行
④sed -rn '/wo+/p' test.txt #打印所有包含字符"wo"后面跟随一个或多个字符"o"的行
⑤sed -n '3,6p' test.txt #打印第3到6行的内容
⑥sed -n 'p;n' test.txt #打印奇数行
⑦sed -n 'n;p' test.txt #打印偶数行
⑧sed -n '1,6{p;n}' test.txt #打印1到6行之间的奇数行
⑨sed -n '5,${p;n}' test.txt #从第5行开始打印奇数行
⑩sed -n '/the/p' test.txt #匹配the
sed -n '5,/the/p' test.txt #匹配从第5行开始到包含the的行
sed -n '/the/,10p' test.txt #匹配从包含the的行到第10行结束
sed -n '/the/=' test.txt #打印包含the的行号 =命令用于在行的前面输出行号
①nl test.txt | sed '3d' #删除第3行
②nl test.txt | sed '3,5d'
③nl test.txt | sed '/the/d' #删除the所在行
④nl命令可以将文本文件的内容加上行号,并将处理后的结果输出到终端窗口。
①nl test.txt | sed 's/the/TTTTTT/' #替换全文本
②nl test.txt | sed '4s/the/TTTTTT/' #替换第4行
③nl test.txt | sed 's/l/L/2' #替换匹配到的第2个l
H:复制;g:覆盖;G:追加行;w:保存;r:读取;a:追加内容
①sed '/the/{H;d};$G' test.txt #匹配the所在行并迁移至文件末尾
②sed '3aTest' test.txt #在第3行下面新建行并写入Test
③sed '/the/aTest' test.txt #匹配the所在行并在下一行写入Test
vim opt.txt
1,5H
1,5d
16G
sed -f opt.txt test.txt #将1到5行迁移至16行后
awk 选项 '模式或条件{编辑命令}' 文件1 文件2 ...
awk -f 脚本文件 文件1 文件2 ...
1、-F 指定每行的分隔符
2、默认分隔符为空格
①FS:指定每行的分隔符
②NF:指定当前处理行的字段个数
③NR:当前处理行的行号
④$0:当前处理行的整行内容
⑤$n:当前处理的第n个字段
⑥FILENAME:处理文件名
⑦RS:数据记录分隔,默认是\n
①awk '{print}' /etc/passwd #等同cat
②awk 'NR==1{print}' /etc/passwd #打印第1行
③awk 'NR>=1&&NR<=3{print}' /etc/passwd #打印前3行
④awk 'NR==1,NR==3{print}' /etc/passwd #打印1到3行
⑤awk 'NR%2==0{print}' /etc/passwd #打印偶数行
⑥awk 'NR%2!=0{print}' /etc/passwd #打印奇数行
①ifconfig ens33 |awk '/netmask/{print $2}' #筛选IP地址
②#筛选用户信息文件第一行的前三段
awk -F : 'NR==1{print $1 $2 $3}' /etc/passwd
awk -F : 'NR==1{print $1,$2,$3}' /etc/passwd
awk -F : 'NR==1{print $1"|"$2"|"$3}' /etc/passwd
③cat /etc/shadow | awk -F : '$2=="!!"{print $1}' #打印不能登录系统的用户 !!表示用户无密码
统计能够登录系统的用户个数
cat /etc/passwd | awk -F : '/bash$/{print | "wc -l"}' /etc/passwd
cat /etc/passwd | awk -F : '/bash$/{print }' /etc/passwd | wc -l