目录
这里接上一篇博客:https://blog.csdn.net/weixin_43997530/article/details/111830755
1、Shell工具(二)
1.1 Awk
一个强大的文本分析工具,把文件逐行读入,以空格为默认分割符将每行切片,切开的部分再进行分析处理。
- awk [选项参数] ‘pattern1{action1} pattern2{action2}...’ filename
- pattern:表示AWK在数据中查找的内容,就是匹配模式;这里可以看一下我的另一篇博客:https://blog.csdn.net/weixin_43997530/article/details/111796444
- action:在找到匹配内容时所执行的一系列命令
选项参数 | 功能 |
-F | 指定输入文件折分隔符 |
-v | 赋值一个用户定义变量 |
注:这里的参数也只是常用的,并非所有参数。
练习:
(1)搜索passwd文件以root关键字开头的所有行,并输出该行的第7列。
[root@localhost test]# cp /etc/passwd ./ //这里将/etc/passwd文件作为原始数据进行处理
[root@localhost test]# awk -F: '/^root/ {print $7}' passwd
/bin/bash
(2)搜索passwd文件以root关键字开头的所有行,并输出该行的第1列和第7列,中间以“,”号分割:
[root@localhost test]# awk -F : '/^root/ {print $1,$7}' passwd
root /bin/bash
[root@localhost test]# awk -F : '/^root/ {print $1","$7}' passwd
root,/bin/bas
注:只有匹配了pattern的行才会执行action
(3)只显示/etc/passwd的第一列和第七列,以逗号分割,且在所有行前面添加列名user,shell在最后一行添加"dahai,/bin/zuishuai"。
[root@localhost test]# awk -F : 'BEGIN{print "user,shell"} {print $1","$7} END{print "dahai,/bin/zuishuai"}' passwd
user,shell
root,/bin/bash
bin,/sbin/nologin
daemon,/sbin/nologin
adm,/sbin/nologin
lp,/sbin/nologin
......
geoclue,/sbin/nologin
redhat,/bin/bash
dahai,/bin/zuishuai
注:BEGIN 在所有数据读取行之前执行;END 在所有数据执行之后执行。
(4)将passwd文件中的用户id增加数值1并输出
[root@localhost test]# awk -v i=1 -F: '{print $3+i}' passwd
1
2
3
4
5
6
7
Awk内置变量
变量 | 说明 |
FILENAME | 文件名 |
NR | 已读的记录数(可以认为是行号) |
NF | 浏览记录的域的个数(切割后,列的个数) |
(1)统计passwd文件名,每行的行号,每行的列数
[root@localhost test]# awk -F: '{print "filename:" FILENAME ", linenumber:" NR ",columns:" NF}' passwd
filename:passwd, linenumber:1,columns:7
filename:passwd, linenumber:2,columns:7
filename:passwd, linenumber:3,columns:7
(2)切割IP
[root@localhost test]# ifconfig ens160 | grep inet | awk -F" " '{print $2}'
192.168.67.133
(3)查询sed..txt
[root@localhost ~]# awk '/^$/{print NR}' sed.txt
5
1.2 Sort
Sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。
sort(选项)(参数) //参数:指定待排序的文件列表
选项 | 说明 |
-n | 依照数值的大小排序 |
-r | 以相反的顺序来排序 |
-t | 设置排序时所用的分隔字符 |
-k | 指定需要排序的列 |
注:选项仅为部分常用参数,
练习:
[root@localhost test]# vim sort.sh //数据准备
bb:40:5.4
bd:20:4.2
xz:50:2.3
cls:10:3.5
ss:30:1.6
[root@localhost test]# sort -t : -rk3 sort.sh //按照“:”分割后的第三列倒序排序。
bb:40:5.4
bd:20:4.2
cls:10:3.5
xz:50:2.3
ss:30:1.6
二、企业笔试真题
1. 使用Linux命令查询file1中空行所在的行号:
[root@localhost ~]# awk '/^$/{print NR}' file1.txt
5
2. 有文件chengji.txt内容如下;使用Linux命令计算第二列的和并输出。
- 张三 40
- 李四 50
- 王五 60
[root@localhost test]# cat chengji.txt | awk -F " " '{sum+=$2} END{print sum}'
150
3. Shell脚本里如何检查一个文件是否存在?如果不存在该如何处理?
#!/bin/bash
if [ -f file.txt ]; then
echo "文件存在!"
else
echo "文件不存在!"
fi
4. 用shell写一个脚本,对文本中无序的一列数字排序,并计算之和。
[root@CentOS6-2 ~]# cat test.txt
9
8
7
6
5
4
3
2
10
1
[root@CentOS6-2 ~]# sort -n test.txt|awk '{a+=$0;print $0}END{print "SUM="a}'
1
2
3
4
5
6
7
8
9
10
SUM=55
5. 请用shell脚本写出查找当前文件夹(/home)下所有的文本文件内容中包含有字符”shen”的文件名称。
[root@localhost test]# grep -r "shen" /home | cut -d ":" -f 1
/home/test/cut.txt