1、sort(排序)
sort [OPTION]... [FILE]...
选项说明:
-r:倒序
-n:按数字排序
-t:指定分隔符(默认空格)
-k:指定第几列,指定几列几字符(指定1,1 3.1,3.3)
# 测试文件
[root@test ~]# cat test.txt
e:11
a:2
c:3
p:5
d:1
f:7
# 使用 sort 对上面文件进行排序
[root@test ~]# sort test.txt
a:2
c:3
d:1
e:11
f:7
p:5
# 结果是按第一列字母进行排序的
# 可以使用 -t 指定分隔符, 使用 -k 指定需要排序的列。
[root@test ~]# sort -t ":" -k2 test.txt
d:1
e:11
a:2
c:3
p:5
f:7
# 结果第2列2行为11,显然不是我们要的结果。
# 因为按照排序的方式,只会根据第一个字符进行排序,11的第一个字符是1,按照字符来排序确实比2小。
# 如果想要按照数字的方式进行排序, 需要使用 -n 选项。
[root@test ~]# sort -t ":" -k2 -n test.txt
d:1
a:2
c:3
p:5
f:7
e:11
2、uniq(去重)
如果文件中有多行完全相同的内容,我们期望删除重复的行并统计出完全相同的行出现的总次数,那么就可以组合使用 uniq 和 sort 解决这个问题
uniq [OPTION]... [INPUT [OUTPUT]]
选项说明:
-c:计算重复的行
# 测试文件
[root@test ~]# cat test.txt
abc
123
abc
123
efg
efg
# 单独使用,并没有达成我们的期望。可以明显看出重复的行要连续在一起才能达成我们的期望,所以就需要用到 sort。
[root@test ~]# cat test.txt | uniq -c
1 abc
1 123
1 abc
1 123
2 efg
# uniq 和 sort 组合使用。
# 先使用 sort 排序, 让重复行连续在一起,再使用 uniq 去除相邻重复的行并统计
[root@test ~]# cat test.txt | sort | uniq -c
2 123
2 abc
2 efg
3、cut(截取字段)
cut命令用于按列提取文本字符。
cut OPTION... [FILE]...
选项说明:
-d:指定分隔符
-f:数字,取第几列。例如“–f3,6”,表示取第3列和第6列。
-c:按字符取(空格也算)
# 提取 /etc/passwd 文件中用户名和其对应的Shell解释器
[root@test ~]# cut -d ":" -f 1,7 /etc/passwd
root:/bin/bash
bin:/sbin/nologin
daemon:/sbin/nologin
adm:/sbin/nologin
......
# 按字符截取
[root@test ~]# echo "abcdefg" > test.txt
[root@test ~]# cut -c1,3 test.txt
ac
[root@test ~]# cut -c1-3 test.txt
abc
[root@test ~]# cut -c1- test.txt # 截取第一个及以后的所有字符
abcdefg
[root@test ~]# cut -c-3 test.txt # 截取前3个字符
abc
4、tr(替换)
tr命令用于替换文本文件中的字符。
tr [OPTION]... SET1 [SET2]
选项说明:
-c:反选设定字符。也就是符合 SET1 的部份不做处理,不符合的剩余部份才进行转换
-d:删除指令字符
支持的常用转义字符:
\\:反斜杠
\b:退格键
\f:换页
\n:新行
\r:回车
\t:水平制表符
# 测试文件
[root@test ~]# cat test.txt
abcd
# 替换a为1
[root@test ~]# cat test.txt | tr a 1
1bcd
# 小写替换成大写
[root@test ~]# cat test.txt | tr [a-z] [A-Z]
ABCD
# 列转行
[root@test ~]# cat test.txt
a
b
c
d
[root@test ~]# cat test.txt |tr "\n" " " | sed 's/$/\n/'
a b c d
[root@test ~]# cat test.txt |tr "\n" " "| sed 's/$/\n/' | tr -d " "
abcd
5、wc(统计行号)
wc [OPTION]... [FILE]...
选项说明:
-l:显示文件行数
-c:显示文件字节
-w:显示文件单词
# 统计 /etc/passwd 文件有多少行
[root@test ~]# wc -l /etc/passwd
18 /etc/passwd
# 其它统计行号方法
[root@test ~]# grep -n ".*" /etc/passwd | tail -1 | cut -d ":" -f1
18
[root@test ~]# awk '{print NR}' /etc/passwd | tail -1
18
[root@test ~]# cat -n /etc/passwd | tail -n1 | cut -f1 | tr -d " "
18
5、示例
以下是一段nginx日志,请统计每个ip的访问次数并排序。
[root@test ~]# cat nginx-access.log
101.132.175.77 - - [22/Feb/2021:11:47:41 +0800] "GET / HTTP/1.1" 302 145 "-" "Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D)" "-"
101.132.175.77 - - [22/Feb/2021:11:47:41 +0800] "GET / HTTP/1.1" 200 9409 "-" "Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D)" "-"
47.98.103.245 - - [22/Feb/2021:11:59:04 +0800] "GET / HTTP/1.1" 200 9409 "-" "Mozilla/5.0 (Android Mobile Safari) android mobile safari" "-"
3.122.195.44 - - [22/Feb/2021:12:09:24 +0800] "GET /.git/HEAD HTTP/1.1" 302 145 "-" "curl/7.61.1" "-"
3.122.195.44 - - [22/Feb/2021:12:09:25 +0800] "GET /.git/HEAD HTTP/1.1" 404 27413 "-" "curl/7.61.1" "-"
101.132.175.77 - - [22/Feb/2021:11:47:41 +0800] "GET / HTTP/1.1" 302 145 "-" "Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D)" "-"
3.122.195.44 - - [22/Feb/2021:12:09:24 +0800] "GET /.git/HEAD HTTP/1.1" 302 145 "-" "curl/7.61.1" "-"
47.98.103.245 - - [22/Feb/2021:11:59:04 +0800] "GET / HTTP/1.1" 200 9409 "-" "Mozilla/5.0 (Android Mobile Safari) android mobile safari" "-"
3.122.195.44 - - [22/Feb/2021:12:09:24 +0800] "GET /.git/HEAD HTTP/1.1" 302 145 "-" "curl/7.61.1" "-"
[root@test ~]# cat nginx-access.log | cut -d " " -f1 | sort | uniq -c | sort -nr
4 3.122.195.44
3 101.132.175.77
2 47.98.103.245