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