常用文件命令/正则表达式

236 阅读6分钟

常用文本命令

1.1 sort

以行为单位对文件内容进行排序,也可以根据不同的数据类型进行排序,比较原则是从首字符向后,一次按ASCII码值进行比较,最后将他们按升序输出

语法格式:

sort [选项] 参数
car file | sort 选项

常用选项:

-n:按照数字从小到大进行排序

-r:反向排序(从大到小)

-u:等同于uniq,表示相同的数据合并显示成一行

-t:制定字符分隔符,默认使用[ tab ]键分隔

-k:自定字段

-b:忽略每行前面的空格

实例:

1.sort默认不加选项

image.png **2.sort -n**

image.png

3.sort -nr

image.png

4查看etc/passwd文件并让uid字段从小到大显示sort -t ':' -k 3 -n /etc/passwd

image.png

5.把/var目录下的文件以降序进行排列并以文件形式导出到家目录中

image.png

1.2 uniq

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

语法格式:

uniq [选项] 参数
cat file | uniq 选项

常用选项:

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

实例:

1.uniq不加选项(仅能去除连续重复的行的内容)

image.png 2 sort -n管道符配合uniq -c进行重复次数的计算**(生产环境中用的比较多)**

image.png

image.png

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

image.png

这里最后有一个换行符是因为我们没有输入\c

拓展:1
  • echo -e 不输出换行符

  • echo- n "xxxx\c" \c不输出换行符

除了以上这两种输出的内容皆为不会携带换行符,echo其他输出方式都会默认携带一个换行符\n

  • 2.tr-s的用法

image.png

tr-s压缩空行的方法

image.png

拓展: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的第一个字段

image.png


  • 2.-f可以显示多个字段

image.png

拓展:

截取字符串的方法

${i:0:3}     #下标从0开始  :  截取的字符长度

echo $i |cut =b 1-3     #下标从1开始  起始位置-终止为止

expr substr $i 1 3     #下标从1开始  1代表其实位置  3代表截取的字符长度

image.png

1.5 split

将一个大文件拆分成若干个小文件

语法格式:

split 选项 参数 原始文件 拆分后文件名前缀

常用选项

  • -l:以行数拆分

  • -b:以大小拆分

实例:

1.以10行为单位分割etc/passwd文件内容

image.png

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.元字符*号

image.png

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


image.png

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


image.png

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开头的,后面随意

image.png