目录
2.4选项 -t :指定分隔符;-k :指定字符;-o :指定保存文件
3.1将远程破解主机密码的ip进行筛选,将这些ip输入到/etc/host.deny文件中,远程登录密码输入错误的IP地址会记录在 /var/log/secure 日志文件中
2.1选项 -c :保留字符集1的字符,其他字符用字符集2字符替换
2.2选项 --output-delimiter :更改输出内容的分隔符
一、sort命令
以行为单位对文件内容进行排序,也可以根据不同的数据类型来排序。
比较原则:从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。
1.格式
sort [选项] 参数
一般配合 cat 命令使用
cat file | sort 选项
常用选项:
-n:按照数字进行排序
-r:反向排序
-u:等同于uniq,表示相同的数据仅显示一行
-t:指定字段分隔符,默认使用tab键分隔
-k:指定排序字段
-o <输出文件>:将排序后的结果转存至指定文件
-f:忽略大小写,会将小写字母都转换为大写字母来进行比较
-b:忽略每行前面的空格
2.命令演示
#不加选项排序
sort 123.txt
1
12
125
13
13
142
153
5
51
61
2.1 选项 -n :按照数字大小排序
sort -n 123.txt
1
5
12
13
13
51
61
125
142
153
2.2选项 -r :反向排序
sort -nr 123.txt
#不加-n,从首字符依次向后比较
153
142
125
61
51
13
13
12
5
1
2.3选项 -u:隐藏多余行
cat 123.txt
1
12
5
12
61
61
13
sort -u 123.txt
#将相同行多余行隐藏,只显示一行
1
12
13
5
61
2.4选项 -t :指定分隔符;-k :指定字符;-o :指定保存文件
sort -t '.' -k 4 -n 123.txt -o abc.txt
cat abc.txt
192.168.88.10
192.168.88.20
192.168.88.52
192.168.88.62
192.168.88.100
192.168.88.201
二、uniq命令
用于报告或者忽略文件中连续的重复行,常与 sort 命令结合使用
1.语法格式
格式:
uniq [选项] 参数
cat file | uniq
常用选项:
-c:进行计数,并删除文件中重复出现的行
-d:仅显示连续的重复行
-u:仅显示出现一次的行
2.命令演示
2.1只使用uniq命令只隐藏连续重复的多余行
cat 123.txt
12
15
12
666
777
222
222
uniq 123.txt
12
15
12
666
777
222
2.2选项-c :对连续重复行进行计数,并删除重复行
uniq -c 123.txt
1 12
1 15
1 12
1 666
1 777
2 222
#将文件中所有重复行进行计数
sort -n 123.txt | uniq -c
2 12
1 15
2 222
1 666
1 777
2.3选项 -u :仅显示出现一次的行
uniq -u 123.txt
12
15
12
666
777
#将文件行进行排序,然后显示出现一次的行
sort -n 123.txt | uniq -u
15
666
777
2.4选项 -d :仅显示连续重复的行
uniq -d 123.txt
222
sort -n 123.txt | uniq -d
12
222
3.实际应用
3.1将远程破解主机密码的ip进行筛选,将这些ip输入到/etc/host.deny文件中,远程登录密码输入错误的IP地址会记录在 /var/log/secure 日志文件中
将这一行内容从日志文件中提取出来
提取出登录失败的IP地址
排序IP地址并计数
3.2利用脚本实现操作
#!/bin/bash
cat /var/log/secure | grep "Failed password" | awk '{print $11}' | sort -n | uniq -c > ./abc.txt
IFSA=$IFS
IFS=$'\n'
for i in `cat ./abc.txt`
do
num=$(echo $i | awk '{print $1}')
#将大于3次密码错误的远程连接的IP筛查出来
if [ $num -gt 3 ]
then
ip=$(echo $i | awk '{print $2}')
#将ip加入/etc/hosts.deny文件,拒绝访问
echo "sshd:$ip" >> /etc/hosts.deny
fi
done
IFS=$IFSA
三、tr命令
常用来对来自标准输入的字符进行替换,压缩和删除
1.语法格式
格式:
tr [选项] 参数
参数:
字符集1:指定要转换或删除的原字符集。当执行转换操作时,必须使用参数“字符集2”指定转换
的目标字符集。但执行删除操作时,不需要参数“字符集2”
字符集2:指定要转换成的目标字符集
常用选项:
-c:保留字符集1的字符,其他字符(包括换行符 \n)用字符集2替换
-d:删除所有属于字符集1的字符
-s:将重复出现的字符串压缩为一个字符;用字符集2 替换 字符集1
-t:字符集2 替换 字符集1,不加选项同结果
2.命令演示
#将a-z 替换为 A-Z
echo "abc" | tr "a-z" "A-Z"
ABC
#将原字符 a 替换为 A
echo "abc" | tr "a" "A"
Abc
#将字符 ac 替换为 AC
echo "abc" | tr "ac" "AC"
AbC
2.1选项 -c :保留字符集1的字符,其他字符用字符集2字符替换
echo -e "ab\nadc\nabcd" > 123.txt
cat -A 123.txt
ab$
adc$
abcd$
echo -e "ab\nadc\nabcd" | tr -c "ab" "0"
ab0a000ab000
echo -e "ab\nadc\nabcd" | tr -c "ab\n" "0"
ab
a00
ab00
2.2 选项 -d :删除字符集1的字符
echo "hello world" | tr -d "wld"
heo or
echo "hello world" | tr -d " "
helloworld
echo "hello world" | tr -d "ho"
ell wrld
2.3选项 -s :将重复字符压缩成一个字符
echo "hello world" | tr -s "l"
helo world
echo "hello world" | tr -s "l "
helo world
echo -e "a\n\n\nb\n\n\nc"
a
b
c
echo -e "a\n\n\nb\n\n\nc" | tr -s "\n"
a
b
c
echo -e "a\n\n\nb\n\n\nc" | tr -d "\n"
abc
2.4选项 -s :将字符集2字符替换字符集2的字符
echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
#用空格替换冒号
echo $PATH | tr -s ":" " "
/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /root/bin
#用逗号替换冒号
echo $PATH | tr -s ":" ","
/usr/local/sbin,/usr/local/bin,/usr/sbin,/usr/bin,/root/bin
3.用命令对数组中的值进行排序
array=(1 65 32 24 12 23 15)
echo ${array[@]}
1 65 32 24 12 23 15
echo ${array[@]} | tr " " "\n"
1
65
32
24
12
23
15
echo ${array[@]} | tr " " "\n" |sort -n
1
12
15
23
24
32
65
echo ${array[@]} | tr " " "\n" |sort -n | tr "\n" " "
1 12 15 23 24 32 65
四、cut命令
显示行中的指定部分,删除文件中指定字段
1.语法格式
格式:
cut 参数
cat file | cut 选项
常用选项:
-f:通过指定哪一个字段进行提取
-d:指定分隔符,默认分隔符为tab
--complement:用于排除所指定的字段
--output-delimiter:更改输出内容的分隔符
2.命令演示
2.1选项 -f:提取指定字符 ; -d :指定分隔符
tail -3 /etc/passwd
wangwu:x:1003:1003::/home/wangwu:/bin/bash
wolong:x:1004:1004::/home/wolong:/bin/bash
fengchu:x:1005:1005::/home/fengchu:/bin/bash
tail -3 /etc/passwd | cut -d ":" -f 1
wangwu
wolong
fengchu
tail -3 /etc/passwd | cut -d ":" -f 1,3
wangwu:1003
wolong:1004
fengchu:1005
tail -3 /etc/passwd | cut -d ":" -f 1,3,7
wangwu:1003:/bin/bash
wolong:1004:/bin/bash
fengchu:1005:/bin/bash
2.2选项 --output-delimiter :更改输出内容的分隔符
tail -3 /etc/passwd | cut --output-delimiter=" " -d ":" -f 1,3
wangwu 1003
wolong 1004
fengchu 1005
tail -3 /etc/passwd | cut --output-delimiter="," -d ":" -f 1,3
wangwu,1003
wolong,1004
fengchu,1005
#awk命令与cut命令效果相似,输出内容默认分隔符为空格
tail -3 /etc/passwd | awk -F: '{print $1,$3}'
wangwu 1003
wolong 1004
fengchu 1005
tail -3 /etc/passwd | awk -F: '{print $1","$3}'
wangwu,1003
wolong,1004
fengchu,1005
tail -3 /etc/passwd | awk -F: '{print $1":"$3}'
wangwu:1003
wolong:1004
fengchu:1005
2.3选项 -complement :输出排除字段
tail -3 /etc/passwd
wangwu:x:1003:1003::/home/wangwu:/bin/bash
wolong:x:1004:1004::/home/wolong:/bin/bash
fengchu:x:1005:1005::/home/fengchu:/bin/bash
tail -3 /etc/passwd | cut --complement -d ":" -f 1,3
x:1003::/home/wangwu:/bin/bash
x:1004::/home/wolong:/bin/bash
x:1005::/home/fengchu:/bin/bash
tail -3 /etc/passwd | cut --complement -d ":" -f 1
x:1003:1003::/home/wangwu:/bin/bash
x:1004:1004::/home/wolong:/bin/bash
x:1005:1005::/home/fengchu:/bin/bash
tail -3 /etc/passwd | cut --complement -d ":" -f 2,3,4,5
wangwu:/home/wangwu:/bin/bash
wolong:/home/wolong:/bin/bash
fengchu:/home/fengchu:/bin/bash