常用文本命令
1.1 sort
以行为单位对文件内容进行排序,也可以根据不同的数据类型进行排序,比较原则是从首字符向后,一次按ASCII码值进行比较,最后将他们按升序输出
语法格式:
sort [选项] 参数
car file | sort 选项
常用选项:
-n:按照数字从小到大进行排序
-r:反向排序(从大到小)
-u:等同于uniq,表示相同的数据合并显示成一行
-t:制定字符分隔符,默认使用[ tab ]键分隔
-k:自定字段
-b:忽略每行前面的空格
实例:
1.sort默认不加选项
**2.sort -n**
3.sort -nr
4查看etc/passwd文件并让uid字段从小到大显示sort -t ':' -k 3 -n /etc/passwd
5.把/var目录下的文件以降序进行排列并以文件形式导出到家目录中
1.2 uniq
用于报告或者忽略文件中重复出现的行,常与sort命令结合使用
语法格式:
uniq [选项] 参数
cat file | uniq 选项
常用选项:
- -c:进行计数,并删除文件中重复出现的行
- -d:仅显示连续的重复行
- -u:仅显示出现一次的行
实例:
1.uniq不加选项(仅能去除连续重复的行的内容)
2 sort -n管道符配合uniq -c进行重复次数的计算**(生产环境中用的比较多)**
1.3 tr
常用于对来自标准输入的字符进行转换,压缩和删除
语法格式:
tr [现象] [参数]
常用选项:
-
-c:保留字[符集1]的字符,其他的字符(包括换行符\n)用[字符2]替换
-
-d:删除所有属于字符集1的字符
-
-s:将重复出现的字符压缩为一个字符;用[字符2] 替换 [字符1]
-
-t:字[符串2] 替换 [字符1]
实例:
- 1.tr-c的用法(压缩加替换)
[root@localhost ~]# echo -e "adb\nabd\ndbd" |tr -c "ab\n" "0"
a0b
ab0
0b0
#保留ab和换行符,其他的字母均转换为0
[root@localhost ~]# echo -e "adb\nabd\ndbd" |tr -c "ab" "0"
a0b0ab000b00
#保留ab两个字母,其他的转换为0,需要注意这里的换行符已经全部转换成了0
这里最后有一个换行符是因为我们没有输入\c
拓展:1
-
echo -e 不输出换行符
-
echo- n "xxxx\c" \c不输出换行符
除了以上这两种输出的内容皆为不会携带换行符,echo其他输出方式都会默认携带一个换行符\n
- 2.tr-s的用法
tr-s压缩空行的方法
拓展:2
其他去除空行的命令
- cat -s
- grep -v "^$"
- tr -s "\n"
拓展:3
[root@localhost ~]# a=$(echo -e "aa\n\n\n\n\\nbb" | tr -s "\n" ":")
#先定义一个数值
[root@localhost ~]# echo $a
aa:bb:
#我们现在想把最后:号去除
[root@localhost ~]# echo ${a%:*}
aa:bb
#使用正则表达式
%表示从后往前以
以:匹配
*删除:后面的内容
[root@localhost ~]# i='11,22,33,44'
[root@localhost ~]# echo $i
11,22,33,44
[root@localhost ~]# echo ${i%%,*}
11
[root@localhost ~]# echo ${i%,*}
11,22,33
[root@localhost ~]# echo ${i#*,}
22,33,44
#调用i
#号代表从前往后匹配并删除,号后面的内容一位
[root@localhost ~]# echo ${i##*,}
44
两个##号代表最大匹配,以,号为节点,删除第一个,号后面所有的内容
[root@localhost ~]#
总结:
-
${i%,*} 字符数从右往左,最短匹配,的部分被删除
-
${i%%,*} 字符数从右往左,最长匹配,的部分被删除
-
${i#,*} 字符数从左往右,最短匹配,的部分被删除
-
${i##} 字符数从左往右,最长匹配,的部分被删除
拓展:4
windos记事本或者稳定编写的脚本无法在linux正常运行?
解答:
- 在Linux中遇到换行符("\n")会进行回车+换行的操作,回车符反而只会作为控制字符("^m")显示,不发生回车的操作。
- 而在windos中要回车符+换行符("\r\n")才会回车+换行,缺少一个控制符或者顺序不对都不能正确的另起一航
解决方法:
-
1.使用dos2unix软件进行软件,此软件系统不自带需要yum安装包安装后才能使用,安装完成后,使用命令
dos2unix 文件路径转译 -
2.使用命令
cat xxx.txt | tr -d "\r" > new.txt生成新文件
1.4 cut命令
Linux cut命令用于显示每行从开头算起 num1 到 num2 的文字。
语法格式
cut [选项] [file]
cat file |cut 选项
常用选项
- -f :通过指定哪一个字段进行提取。cut命令默认使用"TAB"制表符作为默认的字段分隔符。(-指定连续字段 ,指定不连续字段)
- -d :"TAB"是默认的分隔符,使用此选项可以指定其他的分隔符。
- --complement :此选项用于排除所制定的字段。
- --output-delimiter:更改输出内容的分隔符。
实例:
- 1.查看/etc/passwd的第一个字段
- 2.-f可以显示多个字段
拓展:
截取字符串的方法
${i:0:3} #下标从0开始 : 截取的字符长度
echo $i |cut =b 1-3 #下标从1开始 起始位置-终止为止
expr substr $i 1 3 #下标从1开始 1代表其实位置 3代表截取的字符长度
1.5 split
将一个大文件拆分成若干个小文件
语法格式:
split 选项 参数 原始文件 拆分后文件名前缀
常用选项
-
-l:以行数拆分
-
-b:以大小拆分
实例:
1.以10行为单位分割etc/passwd文件内容
1.6 eval命令
命令字前加上eval时,shell脚本会在执行命令之前扫描它两次。eval命令将首先会先扫描命令行进行所有的置换,然后在执行该命令。该命令使用于那些一次扫描无法实现其功能的变量。该命令对变量进行两次扫描。
总结
sort-排序
uniq-去重
tr-删除 替换 压缩
cut-截取字段或者字符串
split-拆分文件
删除空行的方法
tr -s '\n'
gerp -v '^$'
正则表达式
1.1 正则表达式是什么
- 正则表达式适用于判断语句中,用来检查某一字符串是否满足某一格式
1.2 正则表达式的组成
-
正则表达式是由普通字符与元字符组成
-
普通字符包括大小写字母、数字、标点符号及一些其他符号
-
元字符是指在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符或表达式)在目标对象中的出现模式
1.3 通配符和正则表达式的区别
- 通配符一般用于文件的查找
- 正则表达式则用于配合sed awk等命令实现增删改查功能,更加强大
1.4 基本正则表达式常见元字符:
(支持的工具):grep,egrep,sed,awk
| 字符 | 含义 | 实例 |
|---|---|---|
| \ | 转义字符,用于取消特殊符号的含义 | \n,!,$等 |
| 匹配字符串开始的位置 | ^a,^the | |
| $ | 匹配字符串结束的位置 | word¥,^$匹配空行 |
| . | 匹配除了\n之外的任意的一个字符 | go.d,go..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\}'匹配两位到三位数字 |
| \w | 匹配包括下划线的任何单词字符。\W:匹配任何非单词字符。等价于"[^A-Z0-9_]"。 | |
| \d | 匹配一个数字自读 | |
| \D | 匹配一个非数字字符,等同于[^0-9] | |
| \s | 空白符 | |
| \S | 非空白符 |
注:egrep、awk使用{n}、{n,}、(n,m)匹配时"(}"前不用加"\"
实例
1.元字符*号
2.[list]实例
[root@localhost ~]# cat 1.txt
gd
god
good
gooood
goolad
good
gold
goad
[root@localhost ~]# grep "go[ola]d" 1.txt
good
good
gold
goad
3[^list]实例
[root@localhost ~]# cat 1.txt
gd
god
good
gooood
goolad
good
gold
goad
gggg
gopd
[root@localhost ~]# grep "go[^ola]d" 1.txt
gopd
1.5 扩展正则表达式元字符(支持的工具:egrep,awk)gerp-e sed-r
- +:匹配前面子表达式1次以上,例:go+d,将至少匹配一个o,如god,good,goood等
- ?:匹配前面表达式0次或者1次,例:go?d,将匹配gd或者god
- ():将括号中的字符串作为一个整体,例:g(ood)+d,将匹配oo整体1次以上,如good,gooood等
- |:以或的方式匹配字符串,例:g(oo|la)d,将匹配good或者glad
实例:
[root@localhost ~]# cat 1.txt
gd
god
good
gooood
goolad
good
gold
goad
gggg
gopd
goaaaaaaad
goood
glad
##以上为文件内容
[root@localhost ~]# egrep go+d ##+号的用法,一定要是用grep-e或者egrep等支持的格式
^C
[root@localhost ~]# egrep go+d 1.txt ##至少会匹配一个o
god
good
gooood
good
goood
[root@localhost ~]# egrep go?d 1.txt ##匹配?前面的o 0次或者1次
gd
god
[root@localhost ~]# grep -E "g(oo)+d" 1.txt ##括号的用法,可以把oo当成一个整体,注意,一定要加""
good
gooood
good
[root@localhost ~]# egrep "g(oo|la)d" 1.txt ##()配合|使用,匹配oo或la
good
good
glad
[root@localhost ~]#
1.6 习题
匹配号码:
需要按照一下规则用正则表达式匹配出筛选目标中符合规则的号码
规则:
-
025 5xxxxxxx
-
025 8xxxxxxx
-
025-
-
025 xxxxxxxx
筛选目标: 02588888888
-
025-5555555555
-
025 12345678
-
025 54321678
-
025 ABC88888
思路:可以号码拆分成三段025,中间的空格或者- 还有后面的号码,号码都是5和8开头的,后面随意