sort命令
sort [选项] 参数
cat file | sort 选项
以行为单位对文件内容进行排序,也可以根据不同的数据类型来排序比较原则是从首字符向后,依次按AscII码值进行比较,最后将他们按升序输出。
常用选项
| 选项 | 作用 |
|---|---|
| -n | 按照数字进行排序 |
| -r | 反向排序 |
| -u | 等同于uniq,表示相同的数据仅显示一行 |
| -t | 指定字段分隔符,默认使用[Tab]键分隔 |
| -k | 指定排序字段 |
| -o<输出文件> | 将排序后的结果转存至指定文件 |
| -f | 忽略大小写,会将小写字母都转换为大写字母来进行比较 |
| -b | 忽略每行前面的空格 |
-
按数字进行排序
-
反向排序
-
相同的数据仅显示一行
-
指定分隔符和指定排序字段
-
排序后的结果转存至指定文件
效果和重定向输出类似,重定向输出只能输入静态的内容
-
忽略大小写
用途举例:筛选du统计占用情况
uniq命令
uniq [选项] 参数
cat file | uniq [选项]
用于忽略文件中连续的重复行,通常与sort命令结合使用。(去重)
常用选项
| 选项 | 作用 |
|---|---|
| -c | 进行计数,并删除文件中重复出现的行 |
| -d | 仅显示连续的重复行 |
| -u | 仅显示出现一次的行 |
-
统计重复次数
-
仅显示连续重复行和仅显示出现一次的行
用途举例:可用于监测用户登录次数
脚本内容
#!/bin/bash
#监测用户登录
grep 'Failed password' /var/log/secure | awk '{print $11}' | sort -n | uniq -c > IPS.txt
OLD_IFS=$IFS
IFS=$'\n'
for i in $(cat IPS.txt)
do
num=$(echo $i | awk '{print $1}')
ip=$(echo $i | awk '{print $2}')
if [ $num -gt 3 ];then
echo "sshd:$ip" >> /etc/hosts.deny
fi
done
IFS=$OLD_IFS
rm -f IPS.txt
解析
-
筛选出对应的IP地址并统计次数
-
筛选出相应的数据赋给变量,并对登录次数进行判断
tr命令
tr [选项] 参数1 参数2
常用来对来自标准输入的字符进行替换、压缩和删除
常用选项
| 选项 | 作用 |
|---|---|
| -c | 保留字符集1的字符,其他的字符(包括换行符\n)用字符集2替换 |
| -d | 删除所有属于字符集1的字符 |
| -s | 将重复出现的字符串压缩为一个字符;用字符集2替换字符集1 |
| -t | 字符集2替换字符集1,不加选项同结果 |
-
字符集2替换字符集1
符号也可以替换
字符集1和字符集2具有对应关系
-
保留字符集1的字符,其他的字符用字符集2替换
换行符\n也会被替换
-
删除所有属于字符集的字符
-
压缩并替换
删除空行
使用grep
使用tr -s
补充:删除windows文件“造成”的'^M'字符
Windows中编写的脚本文件移动到Linux中会多“^M”字符。
原因
- Linux中遇到换行符("\n")会进行回车+换行的操作,回车符反而只会作为控制字符("^M")显示,不发生回车的操作。
- windows中要回车符+换行符("\r\n")才会回车+换行,缺少一个控制符或者顺序不对都不能正确的另起一行。
删除^M的方法
-
方法一:利用tr删除
-
方法二:安装dos2unix,使用dos2unix删除
补充:使用sort和tr排序数组
cut命令
cut 参数
cut file | cut 选项
显示行中的指定部分,删除文件中指定字段。
常用选项
| 选项 | 作用 |
|---|---|
| -f | 通过指定哪一个字段进行提取。cut命令使用"TAB"作为默认的字段分隔符。 |
| -d | “TAB"是默认的分隔符,使用此选项可以更改为其他的分隔符。 |
| -b | 截取字符串 |
| --complement | 此选项用于排除所指定的字段。 |
| --output-delimiter | 更改输出内容的分隔符。 |
-
指定提取哪一字段,指定分隔符
-
截取字符串
-
echo直接截取
-
cut -b
-
expr substr 变量名 第几个字符开始 截取长度
-
-
用于排除所指定的字段
-
更改输出内容的分隔符
split命令
split 选项 参数 原始文件 拆分后文件名前缀
可将将一个大的文件拆分成若干小文件
常用选项
| 选项 | 作用 |
|---|---|
| -l | 以行数拆分 |
| -b | 以大小拆分 |
paste命令
paste [-s] [-d<间隔字符>] 文件..
用于合并文件的列
普通的合并,通过重定向追加,或者将两个文件重定向输出到第三个文件即可完成。
常用选项
| 选项 | 作用 |
|---|---|
| -d <间隔字符> | 用指定的间隔字符取代制表符 |
| -s | 把多行内容合并为一行进行显示 |
-
用指定的间隔字符取代制表符
-
多行内容合并为一行进行显示
-
组合使用
将文件1的第2列和文件2的第3列合并
- 将两个文件的对应列分别导出到另一个文件,然后再使用paste合并。
eval命令
命令字前加上eval时,shell会在执行命令之前扫描它两次。eval命令将首先会先扫描命令行进行所有的置换,然后再执行该命令。该命令适用于那些一次扫描无法实现其功能的变量。该命令对变量进行两次扫描。
即先解析命令中的变量,再执行解析后的命令。
结合脚本使用