排序命令sort、uniq和字符转换命令tr以及正则表达式(详细到震撼我妈一整年!)

排序命令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 

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_35456705/article/details/112133474