排序命令sort、uniq和字符转换命令tr以及正则表达式
文章目录
一、sort命令
以行为单位对文件内容进行排序,也可以根据不同的数据类型来排序
- 格式:
sort [选项] 参数
cat file | sort 选项
- 常见选项及其功能
常见选项 | 作用/功能 |
---|---|
-f | 忽略大小写,例如A与a视为编码相同 |
-b | 忽略最前面的空格字符部分 |
-M | 以三字符月份来进行排序,例 JAN、DEC |
-n | 按照数字进行排序 |
-r | 反向排序 |
-u | 就是uniq,相同的数据仅显示一行 |
-t | 指定分隔符,默认使用[Tab]键来分隔 |
-k | 指定排序字段 |
-o | 将排序后的结果转存到指定文件 |
例1:
①个人账户都记录在/etc/passwd下,使用cat /etc/passwd | sort进行排序,默认按照【第一个字符】排序,而且是以【文字】形式来排序,所以由a排到最后
②以第三栏来排序,当没有加-n的时候可以看到,并没有按照数字大小进行排序,一团糟
③如果要把排序后的结果输出到其他文件可以使用-o 【文件位置】,不需要再重新新建文件,会自动建立个11.txt
sort -t ':' -k 3 -n /etc/passwd -o 11.txt
查看输出后的结果
④另外加上-n告诉sort以数字来排序以后,非常清晰
⑤再加上-r进行反向排序
例2:
①自创个1.txt文件,用sort进行排序。可得知优先级 空行>数字>字母顺序>小写字母>大写字母,在此基础上(空格>制表符)
用cat -A能清楚的查看到相关特殊符号
②再用sort -f进行排序如下,优先级:空行>Tab>空格>数字>字母顺序>大写字母>小写字母
③用sort -u进行去重,可以注意到只有ABC和123实现了去重。因为前面含有空格和Tab的行也不算相同数据
补充:统计目录下所有文件大小
①要将文件夹中的所有文件按大小排序,而且只看占用最大的5个,可以用以下命令
du -a | sort -rn | head -5
命令解释:
du -a 统计目录下所有文件的大小
sort -nr以数字大小排序且是反向排序即反向排序
head后不加选项默认显示前10个,加-5只显示前5个
注意:-n代表按照数字排序,只认数字不认单位,本例中的数字就是文件大小,单位是默认的KB,所以这个命令不能用du -ah,这会使排序结果出现5M小于20K的情况。
②如果需要以MB显示可以使用命令
du -am | sort -rn | head -5
③如果需要把统计结果保存在其他文件中可使用命令
du -am | sort -rn | head > du4.txt
④保存在du5.txt文件,然后查看
du -am | sort -rn -o du5.txt
head du5.txt
二、uniq命令
用于报告或者忽略文件中连续的重复行,常与 sort 命令结合使用
- 格式:
uniq [选项] 参数
cat file | uniq 选项
- 常用选项及其功能
常用选项 | 功能/作用 |
---|---|
-c | 进行计数,并删除文件中重复出现的行 |
-d | 仅显示重复行 |
-u | 仅显示出现一次的行 |
-i | 忽略大小写字符的不同 |
例:
①uniq -c演示
ABC实际上出现了三次,但是这里只计数了2次,因为不在相邻行。
②uniq -d和uniq -u演示
三、tr命令
常用来对来自标准输入的字符进行替换、压缩和删除
- 格式:
tr [选项] [参数]
常用选项及其功能
常用选项 | 功能/作用 |
---|---|
-c | 保留字符集1的字符,其他的字符用(包括换行符\n)字符集2替换 |
-d | 删除所有属于字符集1的字符 |
-s | 将重复出现的字符串压缩为一个字符串;用字符集2 替换 字符集1 |
-t | 字符集2 替换 字符集1,不加选项同结果。 |
参数及其功能
参数 | 功能/作用 |
---|---|
字符集1 | 指定要转换或删除的原字符集。 当执行转换操作时,必须使用参数“字符集2”指定转换的目标字符集。 但执行删除操作时,不需要参数“字符集2”; |
字符集2 | 指定要转换成的目标字符集。 |
例:
①使用下方命令将last输出的信息中,所有的小写字母变成大写字母。
last | tr 'a-z' 'A-Z'
②tr -c 的使用方法,保留字符集1里的指定字符(也可以是换行符等特殊符号)不变,其他字符替换为最后的指定字符
echo -e "abc\nabcdab" | tr -c "ab\n" "0"
③tr -d 的用法,删除指定字符,不需要参数字符集2。
实际上双引号"",和单引号’'和不加引号都可执行,且结果相同
echo "hello world" | tr -d "od"
④tr -s的用法将重复的字符串压缩为一个字符,或者压缩之后再用字符串2进行替换压缩的字符
echo "hellllo worrrllllld" | tr -s 'lr'
echo "hellllo worrrllllld" | tr -s 'lr' '78'
比如也可以把路径变量PATH里的冒号":",替换为换行符"/n"
echo $PATH | tr -s ":" "\n"
⑤结合sort命令完成数组的排序
arr=(8 5 2 9 7 1)
echo ${arr[*]} | tr ' ' '\n' | sort -n
补充:把Windows文件里的断行符号“^M”移到Linux系统时去除
所以当我们要在Linux系统中使用Windows中的文本文件,可以去除 DOS 文件留下来的 ^M 这个断行符号,处理 Linux&Windows 系统中的人们最麻烦的一件事就是这个事情了,亦即是 DOS 底下会自动的在每行行尾加入 ^M 这个断行符号,我们可以使用这个 tr 来将 ^M 去除!,^M 可以使用 \r 来代替。
例:
把Windows系统中的文件拖到xshell里,然后用cat -A或cat -e查看其特殊符号
查看tr命令可处理的特殊字符,用以下命令查看
man tr
删除DOS文件自带的“^M”字符
cat tr.txt | tr -s "\r" "\n" > tr1.txt
或
cat tr.txt | tr -d "\r" > tr1.txt
四、正则表达式
1.何为正则表达式
正则表达式通常用于判断语句中,用来检查某一字符串是否满足某一格式
正则表达式是由普通字符与元字符组成
普通字符包括大小写字母、数字、标点符号及一些其他符号
元字符是指在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式
2.基础正则表达式
- 支持的工具:grep、egrep、sed、awk
基础正则表达式常见元字符:
\ :转义字符,用于取消特殊符号的含义,例:\!、\n、\$等
^ :匹配字符串开始的位置,例:^a、^the、^#、^[a-z]
$ :匹配字符串结束的位置,例:word$、^$匹配空行
. :匹配除\n之外的任意的一个字符,例:go.d、g..d
* :匹配前面子表达式0次或者多次,例:goo*d、go.*d
[list] :匹配list列表中的一个字符,例:go[ola]d,[abc]、[a-z]、[a-z0-9]、[0-9]匹配任意一位数字
[^list] :匹配任意非list列表中的一个字符,例:[^0-9]、[^A-Z0-9]、[^a-z]匹配任意一位非小写字母
\{n\} :匹配前面的子表达式n次,例:go\{2\}d、'[0-9]\{2\}'匹配两位数字
\{n,\} :匹配前面的子表达式不少于n次,例:go\{2,\}d、'[0-9]\{2,\}'匹配两位及两位以上数字
\{n,m\} :匹配前面的子表达式n到m次,例:go\{2,3\}d、'[0-9]\{2,3\}'匹配两位到三位数字
注:egrep、awk使用{n}、{n,}、{n,m}匹配时“{}”前不用加“\”
3.扩展正则在表达式
- 支持的工具:egrep、awk
扩展正则表达式元字符:
+ :匹配前面子表达式1次以上,例:go+d,将匹配至少一个o,如god、good、goood等
? :匹配前面子表达式0次或者1次,例:go?d,将匹配gd或god
() :将括号中的字符串作为一个整体,例1:g(oo)+d,将匹配oo整体1次以上,如good、gooood等
| :以或的方式匹配字条串,例:g(oo|la)d,将匹配good或者glad
例:
①使用正则表达式匹配邮箱地址
用户名@ :^([a-zA-Z0-9_\-\.\+]+)@
子域名 :([a-zA-Z0-9_\-\.]+)
.顶级域名(字符串长度一般在2到5) :\.([a-zA-Z]\{2,5\})$
egrep '^([a-zA-Z0-9_\-\.\+]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$' youxiang.txt
awk '/^([a-zA-Z0-9_\-\.\+]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$/{print $0}' youxiang.txt
②如果要求@前面不能用特殊符号:
egrep '^([a-zA-Z0-9_\-\.\+]+)([a-zA-Z0-9])@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$' youxiang.txt
③匹配相关手机号
手机号共11位,假如要匹配以187开头的手机号,也就是说后面8位是随机数的组合
egrep、awk使用{n}、{n,}、{n,m}匹配时“{}”前不用加“\”
egrep "^187[0-9]{8}$" haoma.txt
如果用grep,需要加“\”
grep "^187[0-9]\{8\}$" haoma.txt