Shell 脚本的详细解读 (三)

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

 

 

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值