文章目录
- sort命令
- uniq命令
- tr命令
- cut命令
sort命令
-
以行为单位对文件内容进行排序,也可以根据不同的数据类型来排序.
-
比较原则:从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出.
语法格式
sort [选项] 参数
cat file | sort 选项
常用选项
选项 | 命令含义 |
---|---|
-n | 按照数字进行排序,默认按照升序排序 |
-r | 反向排序,按照降序排序 |
-u | 等同于uniq,表示相同的数据仅显示一行 |
-t | 指定字段分隔符,默认使用[Tab]键分隔 |
-k | 指定排序字段 |
-o | <输出文件>:将排序后的结果转存至指定文件 |
-f | 忽略大小写,会将小写字母都转换为写字母来进行比较 |
-b | 忽略每行前面的空格 |
uniq命令
- 用于报告或者忽略文件中连续的重复行,常与sort 命令结合使用.
语法格式
uniq [选项] 参数
cat file | uniq 选项
常用选项
选项 | 命令含义 |
---|---|
-c | 进行计数,并删除文件中重复出现的行 |
-d | 仅显示连续的重复行 |
-u | 仅显示出现一次的行 |
例题演练一:
查找已知文件中出现超过三次的IP地址;
[root@clr /opt/practice]# vim 1.sh
#!/bin/bash
#查找已知文件test4中出现超过三次的IP地址
cat test4 | sort -n -t '.' -k4 | uniq -c > ./count.txt
#将test4文件中的IP地址以.分割,按照地字段进行排序后,统计重复行数,并删除重复行,将结果重定向写入到当
前目录下的count.txt文件中
IFSB=$IFS
IFS=$'\n' #修改for循环的IFS环境只以\n换行符进行分割
for i in $(cat ./count.txt)
do
num=$(echo $i | awk '{print $1}') #获取重复行出现的次数
#echo $num #输出重复次数
if [ $num -gt 3 ];then #判断重复次数大于3次,输出第二字段的ip地址
echo $i | awk '{print $2}'
fi
done
IFS=$IFSB
[root@clr /opt/practice]# vim test4
192.168.80.1
192.168.80.45
192.168.80.1
192.168.80.1
192.168.80.79
192.168.80.11
192.168.80.100
192.168.80.100
192.168.80.561
192.168.80.11
192.168.80.11
192.168.80.100
192.168.80.561
192.168.80.87
192.168.80.11
192.168.80.3
192.168.80.100
192.168.80.51111
[root@clr /opt/practice]# vim count.txt
3 192.168.80.1
1 192.168.80.3
4 192.168.80.11
1 192.168.80.45
1 192.168.80.79
1 192.168.80.87
4 192.168.80.100
2 192.168.80.561
1 192.168.80.51111
例题演练二:
查找一分钟内五次登录系统输入密码错误的用户,并将该IP地址加入到黑名单/etc/hosts.deny中;
[root@clr /opt/practice]# vim 2.sh
#!/bin/bash
#查找一分钟内五次登录系统输入密码错误的用户,并将该IP地址加入到黑名单/etc/hosts.deny中
count=$(cat /var/log/secure|grep 'Failed password'|grep 'root'|awk '{print $11}'|sort -n -t '.' -k4|uniq -c)
#将test4文件中的IP地址以.分割,按照地字段进行排序后,统计重复行数,并删除重复行,将结果赋值给变量count
IFSB=$IFS
IFS=$'\n' #修改for循环的IFS环境只以\n换行符进行分割
for i in $count
do
num=$(echo $i | awk '{print $1}') #获取重复行出现的次数
#echo $num #输出重复次数
if [ $num -gt 5 ];then #判断重复次数大于3次,输出第二字段的ip地址
echo $i | awk '{print $2}'
fi
done
IFS=$IFSB
tr命令
- 常用来对来自标准输入的字符进行替换、压缩和删除.
语法格式
tr [选项] [参数]
常用选项
选项 | 命令含义 |
---|---|
-c | 保留字符集1的字符,其他的字符(包括换行符\n)用字符集2替换 |
-d | 删除所有属于字符集1的字符 |
-s | 将重复出现的字符串压缩为一个字符:用字符集2 替换 字符集1 |
-t | **字符集2 替换 字符集1,不加选项同结果 |
参数
字符集1:指定要转换或删除的原字符集。当执行转换操作时,必须使用参数"字符集2"指定转换的目标字符集。但执行删除操作时,不需要参数"字符集2;
字符集2:指定要转换成的目标字符集。
删除空行的两种方法;
[root@clr /opt/practice]# echo -e "ab\n\n\n\n\n\ncd"
ab
cd
[root@clr /opt/practice]# echo -e "ab\n\n\n\n\n\ncd" | tr -s "\n" #将重复出现的换行符压缩为一个,起到删除空行的效果
ab
cd
[root@clr /opt/practice]# echo -e "ab\n\n\n\n\n\ncd" | grep -v "^$" #grep -v反向取空格,将空格以外的左右行输出
ab
cd
实战演练
利用sort和tr命令,实现元素序列的排序;
[root@clr /opt/practice]# vim 4.sh
#!/bin/bash
#利用sort和tr命令,实现元素序列的排序
arr=(14 25 78 36 1 3 5 45 39 68 14)
echo "排序前数据的值为:${arr[@]}"
newarr=($(echo ${arr[@]}| tr ' ' '\n' | sort -n | tr '\n' ' '))
echo "排序后数据的值为:${newarr[@]}"
windows的换行:由回车符/r和换行符/n组成;而linux的换行:由换行符/n组成.
安装dos2unix工具,即可解决windows与linux文件不能兼容使用的问题;
[root@clr /opt/practice]# yum install -y dos2unix
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.nju.edu.cn
* extras: mirrors.huaweicloud.com
* updates: mirrors.huaweicloud.com
正在解决依赖关系
--> 正在检查事务
---> 软件包 dos2unix.x86_64.0.6.0.3-7.el7 将被 安装
--> 解决依赖关系完成
cut命令
显示行中的指定部分,删除文件中指定字段.
语法格式
cut 参数
cat file | cut选项
常用选项
选项 | 命令含义 |
---|---|
-f | 通过指定哪一个字段进行提取。cut命令使用"TAB"作为默认的字段分隔符 |
-d | "TAB”是默认的分隔符,使用此选项可以更改为其他的分隔符 |
–complement | 此选项用于排除所指定的字段 |
–output-delimiter | 更改输出内容的分隔符 |
注意:
sort -t 指定分隔符 -k 指定字段号
cut -d 指定分隔符 -f 指定字段号