shell脚本语言4 (持续更新)

find、awk和sed的使用:

一、find

find命令是Unix和类Unix系统中一个强大的文件搜索工具,它允许用户在文件系统中按照不同的条件查找文件和目录。由于其灵活性和功能强大,find命令成为系统管理员和开发人员在维护文件系统和查找特定文件时的首选工具。本文将深入介绍find命令的基本语法、常用选项以及高级用法,以帮助读者更全面地了解和使用这个重要的Unix命令。

1.常用选项

选项作用
-amin<分钟>查找在指定时间曾被存取过的文件或目录,单位以分钟计算;
- anewer<参考文件或目录>查找其存取时间较指定文件或目录的存取时间更接近现在的文件或目录;
- atime<24小时数>查找在指定时间曾被存取过的文件或目录,单位以24小时计算;
- cmin<分钟>查找在指定时间之时被更改过的文件或目录;
- cnewer<参考文件或目录>查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
- ctime<24小时数>查找在指定时间之时被更改的文件或目录,单位以24小时计算;
- daystart从本日开始计算时间;
- depth从指定目录下最深层的子目录开始查找;
- expty寻找文件大小为0 Byte的文件,或目录下没有任何子目录或文件的空目录;
- exec<执行指令>假设find指令的回传值为True,就执行该指令;
- false将find指令的回传值皆设为False;

1.1 示例:查找大于1MB的文件

find /path/to/search -type f -size +1M

上述命令将在指定路径下查找所有大小大于1MB的文件。

1.2 示例:查找最近7天内修改过的文件

find /path/to/search -mtime -7

这个例子将在指定路径下查找最近7天内修改过的文件。

1.3 示例:查找属主为user1的文件

find /path/to/search -user user1

上述命令将在指定路径下查找所有属主为user1的文件。

1.4 示例:执行自定义命令

find /path/to/search -name "*.log" -exec rm {} \;

这个例子将删除指定路径下所有扩展名为.log的文件。

2.特殊用法

2.1 使用逻辑操作符

find命令支持逻辑操作符,如-a(与)、-o(或)、!(非),用于组合多个条件。

2.1.1 示例:查找大于1MB且是普通文件的文件
find /path/to/search -type f -size +1M -a -type f

上述命令将查找指定路径下所有大小大于1MB且是普通文件的文件。

2.1.2 示例:查找修改时间在7天之前或文件名以.bak结尾的文件
find /path/to/search \( -mtime +7 -o -name "*.bak" \)

这个例子将查找指定路径下修改时间在7天之前或文件名以.bak结尾的文件。

2.2 搜索多个路径

2.2.1 示例:查找多个目录下的所有文件
find /path/to/dir1 /path/to/dir2 -type f

上述命令将在dir1和dir2两个目录中查找所有文件。

2.3 将find结果用于其他命令

2.3.1 示例:在搜索结果中执行grep
find /path/to/search -type f -name "*.txt" -exec grep "pattern" {} \;

上述命令将在指定路径下所有扩展名为.txt的文件中搜索包含指定模式的行。

2.3.2 示例:将搜索结果输出到文件
find /path/to/search -type f -name "*.log" > logfiles.txt

这个例子将查找指定路径下所有扩展名为.log的文件,并将结果输出到名为logfiles.txt的文件中。

二、sed编辑器

1.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--quietsilent禁止sed编辑器输出,但可以与p命令一起使用完成输出。
-i直接修改目标文本文件。
-r, --regexp-extended支持正则表达式
常用操作
操作含义
s替换,替换指定字符。
d删除,删除选定的行。
a增加,在当前行下面增加一行指定内容。
i插入,在选定行上面插入一行指定内容。
c替换,将选定行替换为指定内容。
y字符转换,转换前后的字符长度必须相同。
p打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容,如果有非打印字符,则以ASCII码输出。其通常与-n选项一起使用。
=打印行号。
l(小写L)打印数据流中的文本和不可打印的AscII字符(比如结束符$、制表符\t)
常用方式

sed -n -e 'p' testfile1            #打印内容

sed -n -e '=' testfile1            #打印行号

sed -n -e 'l' testfile1            #打印隐藏特殊符号

sed -n -e '=;p' testfile1        #打印行号和内容
sed -n -e '=' -e 'p'testfile1    #打印行号和内容

sed -n '2,${n;p}' testfile1                #从第2行开始,从下一行开始打印,即第3、5、7行

sed -n '/user/p' /etc/passwd            #打印包含user的行

sed -n '/^a/p' /etc/passwd                #打印以a开头的行

sed -n '/bath$/p' t/etc/passwd            #打印以bath结尾的行

替换内容

命令格式

行范围 s/旧字符/新字符串/替换标记
数字表明新字符串将替换第几处匹配的地方
g表明新字符串将会替换所有匹配的地方
p打印与替换命令匹配的行,与-n一起使用
w 文件将替换的结果写到文件中

案例:

sed -n 's/root/admin/gp' /etc/passwd > file            #将匹配行所有root替换为admin然后保存替换的行至file

sed 's/root//g' /etc/passwd                            #将匹配行所有root替换为空的

sed 'l,20 s/^/#/' /etc/passwd                        #在第1到20行进行注释

sed '/root/ s/^/#/' /etc/passwd                        #将包含root的行进行注释
sed -rn 's /.*root.*/#&/p' /etc/passwd                #用正则匹配行内容,然后通过&获取前面匹配的内容进行注释后打印
sed  -ir 's/.*swap.*/#&/' /etc/fstab                #禁用swap交换空间
sed -f script.sed testfile2                            #对某个文件执行指定命令文件

sed '1,20w out.txt' /etc/passwd
sed '1,20 s/^/#/w out.txt' /etc/passwd                #将文件的第1到20行进行注释,然后将修改的行内容保存至指定文件

sed '/45/c ABC' testfile2                            #将含有45的行都替换为ABC

sed 'y/145/ABC/' testfile2                            #使所有的1字符转换成a,所有的2字符转换成B,所有的3字符转换成c

sed '1,3a ABC' testfile2                            #在第1行到第3行后都插入ABC新的一行

三、awk编辑器

1.工作原理

  逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。

2.用法

命令格式
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比较倾向于将一行分成多个一次仅读入一条记录,以进行处理。预设值是\n
常用方式

awk '{print}' testfile1   #输出所有内容

awk 'NR==1 {print}' testfile1    #输出指定行内容(第一行)

awk 'NR==1,NR==3 {print}' testfile1        #输出第1~3行内容

awk '/root/{print}' /etc/passwd        #输出含有root的行        

awk 'BEGIN{n=0;while("w" | getline) n++ ;{print n-2}}'        #调用w命令,并用来统计在线用户数

top -b -n 1 | awk -F"," '/%Cpu/ {print $4}' | awk '{print $1}'        #查看当前CPU空闲率

学习干货仅供学习参考!!!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值