Shell 脚本的详细解读 (三)

it2024-01-13  62

Shell命令

cut

功能描述:在文件中负责剪切数据,从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出

 基本用法

cut [选项参数]  filename

说明:默认分隔符是制表符

选项参数说明

选项参数

功能

-f

列号,提取第几列

-d

分隔符,按照指定分隔符分割列

-c

指定具体的字符

案例实操 

################Ⅰ############## # 使用vim cut.txt 定义下面的内容 [root@aims02 cdrom]# cat cut.txt who am i i come from hangzhou do you like hangzhou yes i like hangzhou very much do you know xihu yes i know it a little ################Ⅱ############## # 使用空格字符切割cut.txt中的 第一列和第二列 [root@aims02 cdrom]# cut -d ' ' -f 1,2 cut.txt who am i come do you yes i do you yes i ################Ⅲ############## # 找出所有带yes字符的语句 [root@aims02 cdrom]# cat cut.txt | grep "yes" yes i like hangzhou very much yes i know it a little # 切割出所有的yes [root@aims02 cdrom]# cat cut.txt | grep "yes" | cut -d " " -f 1 yes yes # 计算出来yes的个数 [root@aims02 cdrom]# cat cut.txt | grep "yes" | cut -d " " -f 1 | wc -l 2 ################Ⅳ############## # 找出当前机器的ip地址 # ifconfig查看当前机器ip详情 [root@aims02 cdrom]# ifconfig docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255 ether 02:42:d8:31:3d:8d txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ens192: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.16.32 netmask 255.255.255.0 broadcast 192.168.16.255 inet6 fe80::b59:7a1c:ac62:290d prefixlen 64 scopeid 0x20<link> ether 00:0c:29:72:7b:66 txqueuelen 1000 (Ethernet) RX packets 169659493 bytes 176716893699 (164.5 GiB) RX errors 0 dropped 2367 overruns 0 frame 0 TX packets 57555725 bytes 30949800614 (28.8 GiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 34193930 bytes 126100487875 (117.4 GiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 34193930 bytes 126100487875 (117.4 GiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 # 找出目标ip的行 [root@aims02 cdrom]# ifconfig| grep broadcast inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255 inet 192.168.16.32 netmask 255.255.255.0 broadcast 192.168.16.255 # 切割出目标ip(使用n字符切割找第二列) [root@aims02 cdrom]# ifconfig| grep broadcast | cut -d 'n' -f 2 et 172.17.0.1 et 192.168.16.32 # 再次切割直至找到最终的ip(使用空格切割找第二列) [root@aims02 cdrom]# ifconfig| grep broadcast | cut -d 'n' -f 2 | cut -d " " -f 2 172.17.0.1 192.168.16.32

sed

功能描述:sed是一种编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

基本用法 

sed [选项参数]  ‘command’  filename

选项参数说明

选项参数

功能

-e

直接在指令列模式上进行sed的动作编辑。

-i

直接编辑文件(会直接将文件替换掉)

命令功能描述

命令

功能描述

a

新增,a的后面可以接字串,在下一行出现

d

删除

s

查找并替换 

 案例实操

# 使用上一个案例的cut.txt文件 #################################Ⅰ############################### # 在第二行后面插入文字 # PS: 文件并没有什么其他变化只是在第二行增加了文字 [root@aims02 cdrom]# sed "2a 我是在第二行之后新增加的东西" cut.txt who am i i come from hangzhou 我是在第二行之后新增加的东西 do you like hangzhou yes i like hangzhou very much do you know xihu yes i know it a little #################################Ⅱ############################## # 删除包含yes的行 [root@aims02 cdrom]# sed "/yes/d" cut.txt who am i i come from hangzhou do you like hangzhou do you know xihu #################################Ⅲ############################## # 将所有的yes替换成"好的" [root@aims02 cdrom]# sed "s/yes/是的/g" cut.txt who am i i come from hangzhou do you like hangzhou 是的 i like hangzhou very much do you know xihu 是的 i know it a little ######PS:注意:‘g’表示global,全部替换####### #################################Ⅳ############################## # 删除第二行并将yes替换成"是的" [root@aims02 cdrom]# sed -e '2d' -e 's/yes/是的/g' cut.txt who am i do you like hangzhou 是的 i like hangzhou very much do you know xihu 是的 i know it a little

 awk

功能描述:一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。

 

基本用法

awk [选项参数] ‘pattern1{action1}  pattern2{action2}...’ filename

pattern:表示AWK在数据中查找的内容,就是匹配模式

action:在找到匹配内容时所执行的一系列命令

选项参数说明

选项参数

功能

-F

指定输入文件折分隔符

-v

赋值一个用户定义变量

 

awk的内置变量

变量

说明

FILENAME

文件名

NR

已读的记录数

NF

浏览记录的域的个数(切割后,列的个数)

案例实操 

 

# 依旧使用之前的cut.txt ############################Ⅰ######################### # 查询以yes开头的行 [root@aims02 cdrom]# awk -F ' ' '/^yes/{print}' cut.txt yes i like hangzhou very much yes i know it a little # 查询以yes开头的行(以空格作为分隔符号,取第一列) [root@aims02 cdrom]# awk -F ' ' '/^yes/{print $1}' cut.txt yes yes # 获取多列内容 [root@aims02 cdrom]# awk -F ' ' '/^yes/{print $1,$2,$3}' cut.txt yes i like yes i know # 可以使用逗号进行隔开 [root@aims02 cdrom]# awk -F ' ' '/^yes/{print $1","$2","$3}' cut.txt yes,i,like yes,i,know ### PS:只有匹配到pattern的行才会执行对应后面的action(一般是打印) ############################Ⅱ######################### # 为文件的开始或者是结束增加一些内容 [root@aims02 cdrom]# awk -F ' ' 'BEGIN{print "我是开始内容"} {print $1,$7} END{print "我是结束内容"}' cut.txt 我是开始内容 who i do yes do yes 我是结束内容 ## BEGIN 在所有数据读取行之前执行;END 在所有数据执行之后执行 ############################Ⅲ######################### # 使用用户自定义变量 [root@aims02 cdrom]# awk -v str ='增加的字符' -F ' ' '{print $1,str}' cut.txt who 增加的字符 i 增加的字符 do 增加的字符 yes 增加的字符 do 增加的字符 yes 增加的字符 ## 如果文件中存在数字可以使用$1+number的方式实现数学运算 ## awk -v step=1 -F ' ' '{print $1+step}' cut.txt ############################Ⅳ######################### # 内置函数 [root@aims02 cdrom]# awk -F ' ' '{print $1, "--> desc:filename: "FILENAME", linenumber: "NR", columns: "NF}' cut.txt who --> desc:filename: cut.txt, linenumber: 1, columns: 3 i --> desc:filename: cut.txt, linenumber: 2, columns: 4 do --> desc:filename: cut.txt, linenumber: 3, columns: 4 yes --> desc:filename: cut.txt, linenumber: 4, columns: 6 do --> desc:filename: cut.txt, linenumber: 5, columns: 4 yes --> desc:filename: cut.txt, linenumber: 6, columns: 6

sort

功能描述:sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出

 基本语法

sort(选项)(参数) 

PS: 参数→指定待排序的文件列表

 选项参数说明

选项

说明

-n

依照数值的大小排序

-r

以相反的顺序来排序

-t

设置排序时所用的分隔字符

-k

指定需要排序的列

案例实操 

## 依然是使用cut.txt文件 ## 按照空格分隔符号进行正序排列 [root@aims02 cdrom]# sort -t ' ' cut.txt do you know xihu do you like hangzhou i come from hangzhou who am i yes i know it a little yes i like hangzhou very much ## 根据第一列正序排列(和默认不指定是结果一致) [root@aims02 cdrom]# sort -t ' ' -k 1 cut.txt do you know xihu do you like hangzhou i come from hangzhou who am i yes i know it a little yes i like hangzhou very much ## 根据第二列正序排列 [root@aims02 cdrom]# sort -t ' ' -k 2 cut.txt who am i i come from hangzhou yes i know it a little yes i like hangzhou very much do you know xihu do you like hangzhou ## 根据第二列逆序排列 [root@aims02 cdrom]# sort -t ' ' -rk 2 cut.txt do you like hangzhou do you know xihu yes i like hangzhou very much yes i know it a little i come from hangzhou who am i ## 根据第二列数值大小逆序排列(如果是数字的话效果应该比较明显) [root@aims02 cdrom]# sort -t ' ' -nrk 2 cut.txt yes i like hangzhou very much yes i know it a little who am i i come from hangzhou do you like hangzhou do you know xihu

小练习

创建练习test.txt文件,内容为

who am i calc:zhangsan 30 calc:lisi 40 calc:wangwu 50 calc:zhaoliu 58 i come from hangzhou do you like hangzhou yes i like hangzhou very much do you know xihu yes i know it a little

 

 Q1:使用Linux命令查询test.txt中空行所在的行号

## 找到test.txt 中存空行的行号 [root@aims02 cdrom]# awk -F ' ' '/^$/{print NR}' test.txt 2 3 8 10 15 16

Q2:找到calcu:关键字所在行并计算第二列的和 

## 思路 ## 1.先cat出文件中所有的文字 ## 2.通过grep检索出含有calc:关键字的行 ## 3.通过awk使用空格分割取第二列数字列 ## 4.设定变量sum为各个数字想家 ## 5.使用END关键字输出变量sum [root@aims02 cdrom]# cat test.txt | grep 'calc:'|awk -F ' ' '{sum+=$2} END{print sum}' 178

Q3:将test.txt中含有calc关键字的行根据数值大小进行排序

## 思路和上面一致 ## 先找到目标行,然后使用sort命令,根据空格切割根据数据列排序 [root@aims02 cdrom]# cat test.txt |grep 'calc' | sort -t ' ' -k 2 calc:zhangsan 30 calc:lisi 40 calc:wangwu 50 calc:zhaoliu 58 ## 倒序排列 [root@aims02 cdrom]# cat test.txt |grep 'calc' | sort -t ' ' -nrk 2 calc:zhaoliu 58 calc:wangwu 50 calc:lisi 40 calc:zhangsan 30

Q4:使用shell命令查出/mnt文件下所有文件包含yes字符的文件名称 

## 1.使用grep进行查询(-r递归查询) ## 2.使用cut进行切割出第一个名称 [root@aims02 cdrom]# grep -r yes| cut -d : -f 1 cut.txt cut.txt test.txt test.txt # 思路同上 [root@aims02 cdrom]# grep -r yes| awk -F : '{print $1}' cut.txt cut.txt test.txt test.txt

 

 

最新回复(0)