正则表达式与Linux常用快捷命令(sort、uniq、tr、cut、paste)

一、sort

作用:以行为单位,对文件内容进行排序

格式:

sort 【选项】 参数

常用选项:

|----|---------------------------|
| -n | 按照数字进行排序 |
| -r | 反向排序 |
| -u | 等同于uniq,表示相同的数据仅显示一行 |
| -t | 指定字段分隔符,默认使用[Tab]键分隔 |
| -k | 指定排序字段 |
| -o | <输出文件>将排序后的结果转存至指定文件 |
| -f | 忽略大小写,会将小写字母都转换为大写字母来进行比较 |
| -b | 忽略每行前面的空格 |

示例1

将文件中的内容按数字正向或反向排序

sort -n 文件

sort -nr 文件

示例2

格式:sort -t '字段分割符' -k '字段号'

解析:根据-t指定的分割符的第k个字段进行排序

sort -t ':' -k 3 -n /etc/passwd #将/etc/passwd中的文件的第三个字段按照数字排序

sort -t ':' -k 3 -n /etc/passwd > /opt/passwd.txt #将结果保存到passwd.txt中

sort -t ':' -k 3 -n /etc/passwd -o /opt/passwd.txt #将结果保存到passwd.txt中

示例3:

通过sort命令查找大文件

du -a /var/log | sort -nr

二、uniq

作用:用于报告或者忽略文件中连续的重复行,常与 sort 命令结合使用

语法格式:

uniq [选项] 参数

cat file | uniq 选项

常用选项:

|----|-------------------|
| -c | 进行计数,并删除文件中重复出现的行 |
| -d | 仅显示连续的重复行 |
| -u | 仅显示出现一次的行 |

uniq 1.txt #合并相同的行,且不连续的行不删除

sort -n 1.txt | uniq -c #排序并计数重输出

典型示例:

在 /var/log/secure 记录ssh登录信息,若密码输入失败超过6次,则禁用该用户(即放入到 /etc/hosts.deny)

三、tr命令

作用:替换、压缩、删除

格式: tr 【选项】 【参数】

常用选项:

|----|----------------------------------|
| -c | 保留字符集1的字符,其他的字符(包括换行符\n)用字符集2替换 |
| -d | 删除所有属于字符集1的字符 |
| -s | 将重复出现的字符串压缩为一个字符;用字符集2 替换 字符集1 |
| -t | 字符集2 替换 字符集1,不加选项同结果。 |

基本用法:

[root@localhost ~]# echo abcdefg | tr "ab" "00"         #将ab替换成00
00cdefg
[root@localhost ~]# echo '192.168.10.106'| tr '.' ' '   #将. 替换成空格
192 168 10 106
[root@localhost ~]# echo abcd | tr -c "abc" "6"         #将除了abc以外的字符替换成6,末尾的换行符也换成6
abc66[root@localhost ~]# echo abcd | tr -d "d"          #将d删除
abc

[root@localhost ~]# cat 1.txt
11
22
33
44
33


22
11
66
55
44

33
99
22
33

[root@localhost ~]# sort -n 1.txt | tr -s '\n'    将空行压缩成一个

11
11
22
22
22
33
33
33
33
44
44
55
66
99

删除空行 :

echo -e "aa\n\n\n\n\nbb" | tr -s "\n"

cat testfile5 | tr -s "\n"

不用算法实现排序

[root@localhost ~]# array=(20 50 10 40 60 30)
[root@localhost ~]# echo ${array[@] | tr ' ' '\n' | sort -n | tr '\n' ''}
20 50 10 40 60 30

四、cut命令

作用:显示行中指定的部分,删除文中指定的字段

|--------------------------|----------------------------|
| -d '分隔符' -f 字段序号 | 根据 -d 指定的分隔符的截取显示 -f 指定的字段 |
| --complement | 取反,不显示 -f 指定的字段 |
| --output-delimiter '分隔符' | 指定输出的字段分隔符 |

字符串分片

echo ${变量:下标:长度} #下标起始从0开始

echo $变量 | cut -b 起始下标-终止下标 #下标起始从1开始

expr substr $变量 起始下标 长度 #下标起始从1开始

例:i='abcdefg' 输出cd

1、echo $i | cut -b 3-4 下标从1开始

2、echo ${i:2:2} 下标从0开始

3、expr substr $i 3 2 下标从1开始

四、split命令

作用:按照格式拆分文件

|----|----------------|
| -l | 根据行数分割文件 |
| -b | 根据大小分割文件 |
| -d | 输出的目标文件后缀用数字替代 |

示例:

如何将一个10G文件分割为10个1G的文件 split -b 1G -d 原文件 目标文件名前缀

如何将一个100行文件分割为10个10行的文件 split -l 10 -d 原文件 目标文件名前缀

五、paste命令

作用:文件列合并

|----------|------------|
| -d '分隔符' | 指定输出的字段分隔符 |
| -s | 将每个列横向输出 |

格式:

合并文件的行 cat 文件1 文件2 ... > 新文件

合并文件的列 paste -d '分隔符' 文件1 文件2 ... > 新文件

合并列:

[root@localhost ~]# cat b.txt
1
2
3
4
[root@localhost ~]# cat a.txt
a:zhangsan 
b:lisi
c:wangwu
d:zhaoliu
[root@localhost ~]# paste -d ':' b.txt c.txt
1:zhangsan 
2:lisi
3:wangwu
4:zhaoliu

合并行:

[root@localhost ~]# paste -d ':' -s b.txt c.txt
1:2:3:4
zhangsan :lisi:wangwu:zhaoliu

六:正则表达式

基础元字符

|-----------|-----------------------------------------------------------------------------------------------------|
| \ | 转义字符,将一些特殊符号转义成普通字符 \? \! \\ 将一些普遍字母字符转义成特殊字符 \n \t \r |
| ^ | 匹配以指定字符串开头的 ^XXX |
| $ | 匹配以指定字符串结尾的 XXX$ ^$ |
| . | 代表除了 \n 以外的任意字符 |
| [XXX] | 匹配中括号里的列表中的任意一个字符 [.\n] [0-9] [a-zA-Z0-9] |
| [^XXX] | 匹配除了中括号里的列表中的任何字符 [^0-9]匹配所有非数字的字符 [^a-zA-Z]匹配所有非大小字母的字符 |
| * | 匹配*前面的字符或表达式任意次数(包括0次 1次或多次) .* [0-9]* |
| \{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}匹配时"{}"前不用加"\" |
| \w | 匹配包括下划线的任何单词字符。\W :匹配任何非单词字符。等价于"[^A-Za-z0-9_]"。 |
| \d | 匹配一个数字字符。\D :匹配一个非数字字符。等价于 [^0-9]。 grep -P |
| \s | 空白符。\S :非空白符 |

(注:grep sed 使用时 {} 前面要加 \ ;egep awk grep -E sed -r 使用时 {} 前面不用加 \)

扩展正则表达式元字符

|----|----------------------------------------------------|
| + | 匹配前面子表达式1次以上,例:go+d,将匹配至少一个o,如god、good、goood等 |
| ? | 匹配前面子表达式0次或者1次,例:go?d,将匹配gd或god |
| () | 将括号中的字符串作为一个整体,例:g(oo)+d,将匹配oo整体1次以上,如good、gooood等 |
| | | 以或的方式匹配字符串,例:g(oo|la)d,将匹配good或者glad |

正则表达式匹配E-mail地址

用户名@ :^([a-zA-Z0-9_\-\.\+]+)@

子域名 :([a-zA-Z0-9_\-\.]+)

.顶级域名(字符串长度一般在2到5) :\.([a-zA-Z]{2,5})$

例1:

输出iphone.txt中区号025开头,号码与区号之间可以是空格、-、或者没有,且号码必须是5或8开头的八位数。

cat iphone.txt | egrep "^(025)[ -]?[58][0-9]{7}$"

例2:

电子邮箱:用户名@子域名【.二级域名】

用户名@:长度要求在6-18位,任意大小写英文,任意数字,处理@符号和空格以外的任意符号字符,开题只能是_或字母。

^[a-zA-Z_][^@]{5,17}@

子域名:长度任意,符号只能包含-_

([a-zA-Z0-9_\-\.]+)

.顶级域名:长度在2-5,任意大小写英文

(\.[a-zA-Z]{2,5})$

完整匹配

^[a-zA-Z_][^@]{5,17}@([a-zA-Z0-9_\-\.]+)(\.[a-zA-Z]{2,5})$

相关推荐
JSU_曾是此间年少27 分钟前
数据结构——线性表与链表
数据结构·c++·算法
sjsjs1134 分钟前
【数据结构-合法括号字符串】【hard】【拼多多面试题】力扣32. 最长有效括号
数据结构·leetcode
blammmp1 小时前
Java:数据结构-枚举
java·开发语言·数据结构
昂子的博客2 小时前
基础数据结构——队列(链表实现)
数据结构
lulu_gh_yu3 小时前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法
~yY…s<#>4 小时前
【刷题17】最小栈、栈的压入弹出、逆波兰表达式
c语言·数据结构·c++·算法·leetcode
XuanRanDev5 小时前
【每日一题】LeetCode - 三数之和
数据结构·算法·leetcode·1024程序员节
代码猪猪傻瓜coding5 小时前
力扣1 两数之和
数据结构·算法·leetcode
南宫生7 小时前
贪心算法习题其三【力扣】【算法学习day.20】
java·数据结构·学习·算法·leetcode·贪心算法
weixin_432702267 小时前
代码随想录算法训练营第五十五天|图论理论基础
数据结构·python·算法·深度优先·图论