Linex操作系统-Shell脚本(七)
十一、find命令
find命令可以使用户在文件系统中按照不同的条件查找文件和目录,find命令是系统管理员和开发人员在维护文件系统和查找特定文件时的首选工具
1. find命令基本语法
find [path...] [expression]其中,path是查找的起始路径,可以是目录名、文件名或通配符。expression是用于指定搜索条件的表达式,它可以包含多个选项和操作符。
2.常用选项
| 选项 | 作用 |
|---|---|
| -amin<分钟> | 查找在指定时间曾被存取过的文件或目录,单位以分钟计算; |
| - anewer<参考文件或目录> | 查找其存取时间较指定文件或目录的存取时间更接近现在的文件或目录; |
| - atime<24小时数> | 查找在指定时间曾被存取过的文件或目录,单位以24小时计算; |
| - cmin<分钟> | 查找在指定时间之时被更改过的文件或目录; |
| - cnewer<参考文件或目录> | 查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录; |
| - ctime<24小时数> | 查找在指定时间之时被更改的文件或目录,单位以24小时计算; |
| - daystart | 从本日开始计算时间; |
| - depth | 从指定目录下最深层的子目录开始查找; |
| - expty | 寻找文件大小为0 Byte的文件,或目录下没有任何子目录或文件的空目录; |
| - exec<执行指令> | 假设find指令的回传值为True,就执行该指令; |
| - false | 将find指令的回传值皆设为False; |
| - fls<列表文件> | 此参数的效果和指定“ - ls”参数类似,但会把结果保存为指定的列表文件; |
| - follow | 排除符号连接; |
| - fprint<列表文件> | 此参数的效果和指定“ - print”参数类似,但会把结果保存成指定的列表文件; |
| - fprint0<列表文件> | 此参数的效果和指定“ - print0”参数类似,但会把结果保存成指定的列表文件; |
| - fprintf<列表文件><输出格式> | 此参数的效果和指定“ - printf”参数类似,但会把结果保存成指定的列表文件; |
| - fstype<文件系统类型> | 只寻找该文件系统类型下的文件或目录; |
| - gid<群组识别码> | 查找符合指定之群组识别码的文件或目录; |
| - group<群组名称> | 查找符合指定之群组名称的文件或目录; |
| - help或——help | 在线帮助; |
| - ilname<范本样式> | 此参数的效果和指定“ - lname”参数类似,但忽略字符大小写的差别; |
| - iname<范本样式> | 此参数的效果和指定“ - name”参数类似,但忽略字符大小写的差别; |
| - inum<inode编号> | 查找符合指定的inode编号的文件或目录; |
| - ipath<范本样式> | 此参数的效果和指定“ - path”参数类似,但忽略字符大小写的差别; |
| - iregex<范本样式> | 此参数的效果和指定“ - regexe”参数类似,但忽略字符大小写的差别; |
| - links<连接数目> | 查找符合指定的硬连接数目的文件或目录; |
| - iname<范本样式> | 指定字符串作为寻找符号连接的范本样式; |
| - ls | 假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出; |
| - maxdepth<目录层级> | 设置最大目录层级; |
| - mindepth<目录层级> | 设置最小目录层级; |
| - mmin<分钟> | 查找在指定时间曾被更改过的文件或目录,单位以分钟计算; |
| - mount | 此参数的效果和指定“ - xdev”相同; |
| - mtime<24小时数> | 查找在指定时间曾被更改过的文件或目录,单位以24小时计算; |
| - name<范本样式> | 指定字符串作为寻找文件或目录的范本样式; |
| - newer<参考文件或目录> | 查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录; |
| - nogroup | 找出不属于本地主机群组识别码的文件或目录; |
| - noleaf | 不去考虑目录至少需拥有两个硬连接存在; |
| - nouser | 找出不属于本地主机用户识别码的文件或目录; |
| - ok<执行指令> | 此参数的效果和指定“ - exec”类似,但在执行指令之前会先询问用户,若回答“y”或“Y”,则放弃执行命令; |
| - path<范本样式> | 指定字符串作为寻找目录的范本样式; |
| - perm<权限数值> | 查找符合指定的权限数值的文件或目录; |
| 假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为每列一个名称,每个名称前皆有“. / ”字符串; | |
| - print0 | 假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为全部的名称皆在同一行; |
| - printf<输出格式> | 假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式可以自行指定; |
| - prune | 不寻找字符串作为寻找文件或目录的范本样式; |
| -regex<范本样式> | 指定字符串作为寻找文件或目录的范本样式; |
| - size<文件大小> | 查找符合指定的文件大小的文件; |
| - true | 将find指令的回传值皆设为True; |
| - type<文件类型> | 只寻找符合指定的文件类型的文件; |
| - uid<用户识别码> | 查找符合指定的用户识别码的文件或目录; |
| - used<日数> | 查找文件或目录被更改之后在指定时间曾被存取过的文件或目录,单位以日计算; |
| - user<拥有者名称> | 查找符和指定的拥有者名称的文件或目录; |
| - version或——version | 显示版本信息; |
| - xdev | 将范围局限在先行的文件系统中; |
| - xtype<文件类型> | 此参数的效果和指定“ - type”参数类似,差别在于它针对符号连接检查 |
示例:查找大于1M的文件
find /path/to/search -type f -size +1M示例:查找七天内修改的文件
find /path/to/search -mtime -7示例:查找属主为user1的文件
find /path/to/search -user user1示例:执行自定义命令
find /path/to/search -name "*.log" -exec rm {} \;这个例子将删除指定路径下所有扩展名为.log的文件
3.高级用法
1.使用逻辑操作符
find命令支持逻辑操作符,如-a(与)、-o(或)、!(非),用于组合多个条件。
示例:查找大于1MB且是普通文件的文件
find /path/to/search -type f -size +1M -a -type f示例:查找修改时间在7天前或文件名以.bak结尾的文件
find /path/to/search \( -mtime +7 -o -name "*.bak" \)2.搜索多个路径
示例:查找多个目录下的所有文件
find /path/to/dir1 /path/to/dir2 -type f3.将find结果用于其他命令
示例:在搜索结果中执行grep
find /path/to/search -type f -name "*.txt" -exec grep "pattern" {} \;示例:将搜索结果输出到文件
find /path/to/search -type f -name "*.log" > logfiles.txt4.find命令的性能优化
尽量减少-exec选项的使用,因为每个匹配的文件都会执行一次命令
使用-print选项代替-exec,将结果输出到标准输出,然后使用管道将结果传递给其他命令
使用-maxdepth选项限制递归的深度,以减少搜索的范围
十二、sed编辑器
sed编辑器用法
命令格式
sed -e '操作' 文件l 文件2 ...
sed -n -e '操作' 文件1 文件2 ...
sed -f 脚本文件 文件1 文件2 ...
sed -i -e '操作' 文件1 文件2 ...sed -e 'n{ #n意为:指定行
操作l
操作2
...
}' 文件1 文件2 ...常用选项
| 选项 | 含义 |
|---|---|
-e或--expression= | 表示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一般在执行多个操作命令使用。 |
-f或--file= | 表示用指定的脚本文件来处理输入的文本文件。 |
-h或--help | 显示帮助。 |
-n、--quiet或silent | 禁止sed编辑器输出,但可以与p命令一起使用完成输出。 |
-i | 直接修改目标文本文件。 |
| -r, --regexp-extended | 支持正则表达式 |
常用操作
| 操作 | 含义 |
|---|---|
s | 替换,替换指定字符。 |
d | 删除,删除选定的行。 |
a | 增加,在当前行下面增加一行指定内容。 |
i | 插入,在选定行上面插入一行指定内容。 |
c | 替换,将选定行替换为指定内容。 |
y | 字符转换,转换前后的字符长度必须相同。 |
p | 打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容,如果有非打印字符,则以ASCII码输出。其通常与-n选项一起使用。 |
= | 打印行号。 |
l(小写L) | 打印数据流中的文本和不可打印的AscII字符(比如结束符$、制表符\t) |
常用方式:
打印内容
[root@localhost ~]# sed -n -e 'p' testfile1 #打印内容[root@localhost ~]# sed -n -e '=' testfile1 #打印行号[root@localhost ~]# sed -n -e 'l' testfile1 #打印隐藏特殊符号[root@localhost ~]# sed -n -e '=;p' testfile1 #打印行号和内容
[root@localhost ~]# sed -n -e '=' -e 'p'testfile1 #打印行号和内容sed编辑器的寻址方式
以数字形式表示行区间
用文本模式来过滤出行
[root@localhost ~]# sed -n '1p' testfile1 #打印第1行[root@localhost ~]# sed -n '$p' testfile1 #打印最后一行[root@localhost ~]# sed -n '1,3p' testfile1 #打印1到3行[root@localhost ~]# sed -n '3,$p' testfile1 #从第3行开始打印,直到最后一行结束[root@localhost ~]# sed -n '1,+3p' testfile1 #打印第1行之后的连续3行,即1-4行[root@localhost ~]# sed '5q' testfile1 #打印前5行信息后退出,q表示退出[root@localhost ~]# sed -n 'p;n' testfile1 #打印奇数行,n表示移动到下一行
[root@localhost ~]# sed -n '3{p;n;n;p}' testfile1 #打印第3,5行[root@localhost ~]# sed -n 'n;p' testfile1 #打印偶数行删除行内容
[root@localhost ~]# sed 'd' testfile1 #全删[root@localhost ~]# sed '3d' testfile1 #删除第3行[root@localhost ~]# sed '2,4d' testfile1 #删除第2到4行[root@localhost ~]# sed '$d' testfile1 #删除最后一行[root@localhost ~]# sed '/^$/d' testfile1 #删除空行[root@localhost ~]# sed '/nologin$/d' /etc/passwd #删除以nologin结尾的文件[root@localhost ~]# sed '/nologin$/!d' /etc/passwd #"!"表示取反[root@localhost ~]# sed '/2\|3/d' testfile2 #删除第2行和第3行
[root@localhost ~]# sed '/2/,/3/d' testfile2 #从第一个位置打开行删除功能,到第二个位置关闭行删除功能
[root@localhost ~]# sed '/1/,/3/d' testfile2 #从第一个包含1的行打开删除功能,到第一个包含3的行关闭删除功能,然后接着往下扫描重复之前操作,若包含3的行不存在,则一删到底。替换内容
命令格式
行范围 s/旧字符/新字符串/替换标记替换标记
数字 | 表明新字符串将替换第几处匹配的地方 |
g | 表明新字符串将会替换所有匹配的地方 |
p | 打印与替换命令匹配的行,与-n一起使用 |
w 文件 | 将替换的结果写到文件中 |
使用方式
[root@localhost ~]# sed -n 's/root/admin/p' /etc/passwd #将匹配行中第一个root替换为admin然后打印替换的行[root@localhost ~]# sed -n 's/root/admin/2p' /etc/passwd #将匹配行中第二个root替换为admin然后打印替换的行[root@localhost ~]# sed -n 's/root/admin/gp' /etc/passwd #将匹配行所有root替换为admin然后打印替换的行
[root@localhost ~]# sed -n 's/root/admin/gw file' /etc/passwd #将匹配行所有root替换为admin然后保存替换的行至file
[root@localhost ~]# sed -n 's/root/admin/gp' /etc/passwd > file #将匹配行所有root替换为admin然后保存替换的行至file[root@localhost ~]# sed 's/root//g' /etc/passwd #将匹配行所有root替换为空的[root@localhost ~]# sed 'l,20 s/^/#/' /etc/passwd #在第1到20行进行注释插入内容
基本使用
[root@localhost ~]# sed '/45/c ABC' testfile2 #将含有45的行都替换为ABC[root@localhost ~]# sed 'y/145/ABC/' testfile2 #使所有的1字符转换成a,所有的2字符转换成B,所有的3字符转换成c[root@localhost ~]# sed '1,3a ABC' testfile2 #在第1行到第3行后都插入ABC新的一行[root@localhost ~]# sed '1i ABC' testfile2 #在第一行前插入ABC新的一行[root@localhost ~]# sed '5r /etc/resolv.conf' testfile2 #在第5行读取/etc/resolv.conf文件保持空间的使用
[root@localhost ~]# sed '/root/{H;d};$G’ /etc/passwd #将包含root的行剪切到末尾,H表示复制到剪切板,G表示粘贴到指定行后[root@localhost ~]# sed '1,2H;3,4G' /etc/passwd 高级使用
[root@localhost ~]# echo "111222333" | sed -r 's/(111)(222)/\2\1/' #将字符111和 222互换位置
[root@localhost ~]# echo "111222333" | sed -r 's/^(.)(.*)(.)$/\3\2\1/' #将第一个字符和最后一个字符互换十三、awk编辑器
1.概念
sed命令常用于一整行的处理,而awk比较倾向于将一行分成多个"字段"然后再进行处理。awk信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示。
在使用awk命令的过程中,可以使用逻辑操作符&&表示与、||表示或、!表示非,还可以进行简单的数学运算,如+、-、*、\、%、^、表示加、减、乘、除、取余和乘方。
2.工作原理
逐行读取文本,默认以空格或tab进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。
3.命令用法
命令格式
awk 选项 '模式或条件 {操作}' 文件1 文件2 ...
awk -f 脚本文件 文件l 文件2 ...常用选项
-F 指定分隔符
awk -F ',' '{print}' file1常见的内建变量
| 内建变量 | 含义 |
|---|---|
FS | 列分割符。指定每行文本的字段分隔符,默认为空格或制表位。与-F作用相同。 |
NF | 当前处理的行的字段个数。$NF代表最后一个字段。 |
NR | 当前处理的行的行号(序数)。 |
$0 | 当前处理的行的整行内容。 |
$n | 当前处理行的第n个字段(第n列)。 |
FILENAME | 被处理的文件名。 |
RS | 行分隔符。awk从文件上读取资料时,将根据Rs的定义把资料切割成许多条记录,而awk比较倾向于将一行分成多个一次仅读入一条记录,以进行处理。预设值是 |
常用方式
按行输出文本
[root@localhost opt]# awk '{print}' testfile1
one
two
three
four
five
six
seven
eight
nine
ten
eleven
twelve
[root@localhost opt]# awk '{print $0}' testfile1
one
two
three
four
five
six
seven
eight
nine
ten
eleven
twelve输出指定行内容
###输出第1行内容
[root@localhost opt]# awk 'NR==1 {print}' testfile1
one###输出第3行内容
[root@localhost opt]# awk 'NR==3 {print}' testfile1
three###输出第1~3行内容
[root@localhost opt]# awk 'NR==1,NR==3 {print}' testfile1
one
two
three
[root@localhost opt]# awk '(NR>=1)&&(NR<=3){print}' testfile1
one
two
three###输出第1行、第3行的内容
[root@localhost opt]# awk 'NR==1||NR==3 {print}' testfile1
one
three输出奇偶数行的内容
###输出偶数行的内容
[root@localhost opt]# awk '(NR%2)==0{print}' testfile1
two
four
six
eight
ten
twelve###输出奇数行的内容
[root@localhost opt]# awk '(NR%2)==1{print}' testfile1
one
three
five
seven
nine
eleven输出含有字符串的行
###输出含有root的行
[root@localhost opt]# awk '/root/{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin###输出以root开头的行
[root@localhost opt]# awk '/^root/{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash###输出以nologin结尾的行
[root@localhost opt]# awk '/nologin$/{print}' /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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
...
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin按字段输出文本
[root@localhost opt]# awk -F":" '{print $3}' /etc/passwd
0
1
2
3
4
5
6
...
38
42
29
65534
98
74
70
89
72
1000