which、whereis、sort、uniq、cut、wc
4.文件或命令查找
4.1. which whereis 命令路径查找
which ls #查找ls命令的绝对路径
whereis ls #查找命令的绝对路径、帮助手册等
whereis -b ls #-b 仅显示命令的所在路径
type -a ls #查看命令的绝对路径(包括别名)
4.2. sort 文件内容排序
参数
-r:倒叙
-n:按数字排序
-t:指定分割符(默认空格)
-k:指定第几列,指定第几列几字符(指定1,1 3.1,3.3)
练习文件
cat >> file.txt <<EOF
b:3
c:2
a:4
e:5
d:1
f:11
EOF
sort -t ":" -k2 file.txt #-t指定分割符 -k指定列
sort -t ":" -k2 -n file.txt #-t指定分割符 -k指定列 -n按阿拉伯数字排序
sort -t ":" -k2 -n -r file.txt #-t指定分割符 -k指定列 -n按阿拉伯数字排序 -r倒叙最大的在上面
sort -t ":" -k2 -nr file.txt | head -n3 #提取前三
ps:| 管道:将左边命令的输出结果通过管道交给右边命令的输入
练习二:
cat ip.txt
192.168.3.1 00:0F:AF:81:19:1F
192.168.3.2 00:0F:AF:85:6C:25
192.168.3.3 00:0F:AF:85:70:42
192.168.2.20 00:0F:AF:85:55:DE
192.168.2.21 00:0F:AF:85:6C:09
192.168.2.22 00:0F:AF:85:5C:41
192.168.0.151 00:0F:AF:85:6C:F6
192.168.0.152 00:0F:AF:83:1F:65
192.168.0.153 00:0F:AF:85:70:03
192.168.1.10 00:30:15:A2:3B:B6
192.168.1.11 00:30:15:A3:23:B7
192.168.1.12 00:30:15:A2:3A:A1
192.168.1.1 00:0F:AF:81:19:1F
192.168.2.2 00:0F:AF:85:6C:25
192.168.3.3 00:0F:AF:85:70:42
192.168.2.20 00:0F:AF:85:55:DE
192.168.1.21 00:0F:AF:85:6C:09
192.168.2.22 00:0F:AF:85:5C:41
192.168.0.151 00:0F:AF:85:6C:F6
192.168.1.152 00:0F:AF:83:1F:65
192.168.0.153 00:0F:AF:85:70:03
192.168.3.10 00:30:15:A2:3B:B6
192.168.1.11 00:30:15:A3:23:B7
192.168.3.12 00:30:15:A2:3A:A1
sort -t "." -k3.1,3.1 -k4.1,4.3 -n ip.txt
4.3. uniq 去重并统计出现的次数
必须配合sort 一起使用,先排序,然后去重统计
参数
-c 计算重复的次数,必须挨着的相同行
练习文件
cat >>file3.txt <<EOF
abc
123
abc
123
EOF
sort file3.txt | uniq #去重不统计
sort file3.txt | uniq -c #-c去重统计出现的次数
4.4. cut 截取字段 配合简单了解使用sed swk
选项:
-d:指定分割符
-f:数字,取第几列 -f3,6三列和6列
-c:按字符取(空格也算)
1.产生文件
# echo "Im oldxu, is QQ 552408925" > oldboy.txt
2.需求:过滤出oldboy.txt文件里 oldxu以及552408925
3.如何实现:
实现方法1:
[root@oldboy ~]# cut -d " " -f 2,5 oldboy.txt
oldxu, 552408925
[root@oldboy ~]# cut -d " " -f 2,5 oldboy.txt | sed 's#,##g'
oldxu 552408925
实现方法2:
[root@oldboy ~]# awk '{print $2,$5}' oldboy.txt
oldxu, 552408925
[root@oldboy ~]# awk '{print $2,$5}' oldboy.txt | sed 's#,##g'
oldxu 552408925
实现方法3: awk处理
[root@oldboy ~]# awk -F "," '{print $1,$2}' oldboy.txt | awk '{print $2,$5}'
oldxu 552408925
[root@oldboy ~]# awk -F "[ ,]" '{print $2,$6}' oldboy.txt
oldxu 552408925
高级用法
[ ,]+ +表示重复 前面的字符一次或多次
空格算一个分隔符
逗号算一个分隔符
空格和逗号挨在一起,也算一个分隔符
空格逗号空格,全算一个分隔符
[root@oldboy ~]# awk -F "[ ,]+" '{print $2,$5}' oldboy.txt
oldxu 552408925
4.5. wc 统计文件多少行
选项:
-l 显示文件行数
-c 显示文件字节
-w 显示文件单词
练习统计一个文件有多少行
方法一:
# wc -l /etc/services
11176 /etc/services
方法二:
# cat -n /etc/services |tail -1 |awk '{print $1}'
方法三:
# grep -n ".*" /etc/services |tail -1 |awk -F ":" '{print $1}'
方法四:仅供参考!!!!!!!不纠结
NR: 行号
$0: awk是逐行处理文件的,读入一行,然后将一行的内容赋值给$0变量,
# awk '{print NR,$0}' /etc/services | tail -1 | awk '{print $1}'
11176
练习题: 过滤出/etc/passwd以nologin结尾的内容,并统计有多少行
过滤: grep /etc/passwd
条件: nologin结尾的
并且:
统计出现的内容总共有多少行: wc -l
[root@oldboy ~]# grep "nologin$" /etc/passwd | wc -l
19
练习题:
分析如下日志,统计每个域名被访问的次数。
[root@student tmp]# cat >>web.log<<EOF
http://www.xuliangwei.com/index.html
http://www.xuliangwei.com/1.html
http://post.xuliangwei.com/index.html
http://mp3.xuliangwei.com/index.html
http://www.xuliangwei.com/3.html
http://post.xuliangwei.com/2.html
EOF
思路:
1.要想办法提取域名
2.排序,将相同的域名罗列在一起
3.去重,统计
实现:
[root@oldboy ~]# awk -F '/' '{print $3}' web.log | sort | uniq -c
1 mp3.xuliangwei.com
2 post.xuliangwei.com
3 www.xuliangwei.com
将访问次数最多的排在上面
[root@oldboy ~]# awk -F '/' '{print $3}' web.log | sort | uniq -c | sort -nr
3 www.xuliangwei.com
2 post.xuliangwei.com
1 mp3.xuliangwei.com
----------------------------下午-------------------------------
习题1: 使用awk取出系统的IP地址,思路如下:
1.我要取的IP值在哪里 ifconfig
2.如何缩小取值范围(行)
3.如何精确具体内容(列)
方式1:
[root@oldboy ~]# ifconfig eth0 | head -2 | tail -1 | awk '{print $2}'
172.16.1.53
方式2:
[root@oldboy ~]# ifconfig eth0 | grep "netmask" | awk '{print $2}'
172.16.1.53
习题2: 将/etc/passwd文件中的第一行中的第一列和最后一列位置进行交换。(自行指定以:为分隔符)
源文件:root:x:0:0:root:/root:/bin/bash
改变后:/bin/bash:x:0:0:root:/root:root
习题3: 将/etc/sysconfig/selinux 文件中的SELINUX=enforcing替换成SELINUX=disabled
浙公网安备 33010602011771号