linux基础知识-24

摘要:
linux中的grep,vi,find,sed等命令都支持正则表达式。linux@myccloves:~$grep'^VER'/etc/os-releaseVERSION_ID="15.6"VERSION="15.6"正则表达式用特殊字符组成,称为元字符。已知各个数据之间用水平制表符分隔的:linux@myccloves:~/test$sort-k2-g-r1.txt王五10099.5张三98.597马六94.580李四82.3585.5-k表示按指定列数排序,这里指定的是2。去掉的方法用tail-n+2,这条命令要注意:tail-n2表示显示后两条tail-n+2表示从第二行开始读取所以我们先用tail-n+2过滤掉标题,之后再用管道符流向sort程序:psaux|tail-n+2|sort-k4nr九、uniq命令uniq可以删除重复记录,一般需要和sort组合。linux@myccloves:~/test$cat1.txt010002linux@myccloves:~/test$cat1.txt|uniq-c10113012我们发现有:4个0是重复的,1,2没有重复。

一、正则表达式

正则表达式 (regular expression),简写(regex),用来描述一些表达复杂模式的方法。
linux中的grep, vi, find, sed等命令都支持正则表达式。

linux@myccloves:~$ grep '^VER' /etc/os-release 
VERSION_ID="15.6"
VERSION="15.6"

正则表达式用特殊字符组成,称为元字符(metacharacters)。^表示以……开始,正则表达式应该放到单引号中防止和shell解释时的冲突。

linux@myccloves:~$ cat /etc/os-release | egrep '[ew]{2}'
PRETTY_NAME="Deepin 15"
NAME="Deepin"
ID=deepin
HOME_URL="https://www.deepin.org/"
BUG_REPORT_URL="http://feedback.deepin.org/feedback/"

此例中[ew]表示匹配e或w中的1个,而后面的{2}表示重复两次,也就是说有ee或ww字样的就符合要求。

我们要注意fgrep不支持正则,而grep支持简单的正则,egrep支持扩展正则表达式。

二、正则表达式的组成

一个正则表达式可由下列元素构成:

  • 文字字符 比如:字母,数字等
  • 通配符 比如:"." 表示匹配任意字符
  • 修饰符 可以改变它前面离它最近的模式字符的含义。如:ab*c,匹配ac,abc,abbc,abbbc等,*表示重复0次或多次
  • 锚点 指定模板的上下文,比如一行的开始,或一个字的结束。比如:^cat 表示以cat开头。

三、括号表达式

表达式说明
[aeiou]表示匹配其中的一个字符
[^aeiou]表示匹配非aeiou的一个字符
[a-d]表示匹配a,b,c,d其中的一个
[A-Z]表示匹配所有大写字母
[0-9]表示匹配数字
[:alnum:]表示匹配字母,数字
[:alpha:]表示匹配字母
[:blank:]表示匹配空格和制表符
[:digit:]表示匹配数字
[:lower:]表示匹配小写字母
[:space:]表示匹配空白
[:upper:]表示区大写字母

比如:匹配有大写字母的行

linux@myccloves:/etc$ cat resolv.conf
# Generated by NetworkManager
nameserver 172.16.18.1
linux@myccloves:/etc$ cat resolv.conf | egrep '[[:upper:]]'
# Generated by NetworkManager

四、通用修饰符

表达式说明
?表示重复0次或1次
*表示重复0次或多次
+表示重启1次或多次
{m}表示重复m次
{m,n}表示重复m-n次

注意:修饰符都很贪婪,如:对于now is the time, t.*e匹配the time而不是the,这就是贪婪!

五、描点搜索

表达式说明
^foo表示以foo开头的行
foo$表示以foo结尾的行
<foo>表示字首和字尾, 为了与普通字符<>区分,则用<, >

六、正则表达式分组

对于 ?, *, +重复前面的字符,如果想重复前面的多个字符可以分组。比如: foo(bar)? 重复bar零次或1次。

用()进行分组,多个字符串可以用|分隔。(foo|foobar)表示匹配foo或foobar

七、转义元字符

正则的元字符具有特殊的意义,如果想把它变成普通字符可以用进行转议。比如 "." 表示匹配任意字符,但就想把点当成普通字符点,可以这样:.

总结:

字符功能语法说明
.通配符基本表示匹配一个或任意字符
[abc],[a-z]包含域基本表示域内任意一个字符
[abc],[a-z]排除范围基本表示不包含在域内的任意一个字符
?修饰符扩展表示0或者1个前面的项
*修饰符基本表示0或者多个前面的项
+修饰符扩展表示1或者多个前面的项
{m,n}修饰符扩展表示前面的项重复m-n
{n}修饰符基本表示前面的项重得n次
^基本表示一行的开始
$基本表示一行的结束
<基本表示一个单词的开始
>基本表示一个单词的结束
(...)分组基本修饰一组字符
(...|...)分组扩展允许指定可选模式
转义扩展(基本)转义元字符

注意 :正则表达式与文件名匹配是不同的,意义也不同。所以正则要用''括起来。

八、sort命令

sort命令用于排序,他的选项有:

-b 忽略一行开始的空格符或者制表符
-g 排浮点数排序
-n 按整数排序
-r 降序
-k 指定序列
-t 指定分隔符

sort命令,之前我们接触过,默认按字母顺序排序。可以按数字排序,可以进行升序、降序等。 除此之外,sort可以按字段排序,我们分析一下:

数据如下:姓名,语文,数学

张三	98.5	97
李四	82.35	85.5
王五	100	99.5
马六	94.5	80

sort默认按姓名排序,如果现在想要按语文(第二列)排序,而且是降序怎么办法? 已知各个数据之间用水平制表符分隔的:

linux@myccloves:~/test$ sort -k2 -g -r 1.txt
王五	100	99.5
张三	98.5	97
马六	94.5	80
李四	82.35	85.5

-k 表示按指定列数排序,这里指定的是2。
-g 表示按小数排序。
-r 表示降序。

我们也可以多列排序:

张三	男	98.5	97
李四	男	82.35	85.5
王五	男	100	99.5
王冰	女	94.5	80

先按性别排序,再按语文成绩降序排序:

linux@myccloves:~/test$ sort  -k2,2 -k3gr,3  2.txt
王冰	女	94.5	80
王五	男	100	99.5
张三	男	98.5	97
李四	男	82.35	85.5

-k2,2 表示按第二列排序,后面的2表示到第二列止,如果不指定,则从第二列开始一直到行尾为作关键字。
-k3gr,3 表示按第三列,小数降序排列。

指定分隔符排序,比如:/etc/passwd文件,我想按uid降序排序(第三列):

sort -t: -k3rn /etc/passwd

-t:指定分隔符为 ":"
-k3rn表示第三列,降序,按整数排序。

例:对ps aux按占用内存的大小进行排序

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1 219240  7796 ?        Ss   09:42   0:02 /sbin/init splash
root         2  0.0  0.0      0     0 ?        S    09:42   0:00 [kthreadd]

发现内存占用百分比是第4列:

ps aux | sort -k4nr

如果你运行了,你会发现,标题在里面了,所以我们 ps aux时把标题去掉。 去掉的方法用tail -n +2,这条命令要注意:

  • tail -n 2 表示显示后两条
  • tail -n +2 表示从第二行开始读取

所以我们先用tail -n +2过滤掉标题,之后再用管道符流向 sort程序:

ps aux | tail -n +2 | sort -k4nr 

九、uniq命令

uniq可以删除重复记录,一般需要和sort组合。

linux@myccloves:~/test$ cat 1.txt
0
1
0
0
0
2
linux@myccloves:~/test$ cat 1.txt | uniq -c
	  1 0
	  1 1
	  3 0
	  1 2

我们发现有:4个0是重复的,1,2没有重复。 通过 uniq -c得到的结果是:0重复1次,1重复1次,0重复3次,2重复1次,这里的-c显示重复几次。
但我们0明明是重复4次啊,这说明uniq统计紧挨着的重复项,所以我们需要先排序,再uniq:

linux@myccloves:~/test$ cat 1.txt | sort -n | uniq -c
	  4 0
	  1 1
	  1 2

免责声明:文章转载自《linux基础知识-24》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇《Gamma校正》Redis数据类型,持久化,回收策略下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

带EFI支持的GRUB2安装全记录

版权归作者所有,任何形式转载请联系作者。 作者:keenshoes(来自豆瓣) 来源:https://www.douban.com/note/210077866/  关键词:EFIGRUB2efibootmgrGentoo LINUXWindows 7Mac OS Xmultiboot    做为对传统引导程序grub的升级版本, Grub2的功能非凡,...

linux进阶之yum管理

一、部署私有repo源 1、官网下载需要的仓库: rsync -avrt --delete rsync://mirrors.ustc.edu.cn/centos/7/cloud/x86_64/openstack-pike /export/download/cloud/ 2、安装软件包: yum install yum-utils createrepo ng...

kernel编译

Linux内核编译与安装 Linux内核介绍 Linux内核是一个用C语言写成的,符合POSIX标准的类Unix操作系统。内核是操作系统中最基本的一部分,提供了众多应用程序访问计算机硬件的机制。Linux内核的一大特点就是采用了整体式结构,有很多过程组成,每个过程都可以独立编译,其模块机制又湿得内核保持独立而又易于扩充。Linux发行版实在Linux内核的...

Linux系统负载查询

查询Linux系统负载情况,一般需要了解三个方面的信息: 1、Linux系统配置。如Linux版本号、CPU、内存、网络、磁盘等; 2、收集系统负载信息的手段。常用的工具包有sysstat和procps等。 3、查询结果分析。通过工具包获取系统负载信息,要具体分析系统是否负载、某项指标参数是否超标、系统的瓶颈集中哪几项等。 一、查询Linux系统配置 查询...

图片中文水印在Linux机器下无法显示

因为Linux JDK6不支持中文,解决的办法如下: 进入JDK安装目录 # cd $JAVA_HOME/jre/lib/fonts 建立fallback文件夹,并切换至该文件夹 # mkdir fallback 上传字体文件到该目录下【字体文件可以在C:\Windows\Fonts目录下找】 如:simhei.ttf 黑体;simsun.ttf 宋体...

linux中date命令获取日期信息

linux中date命令用于获取当前的日期 1、 root@PC1:/home/test# date ##在终端直接输入date即可获取当前的日期信息 2022年 01月 14日 星期五 12:30:42 CST 2、 root@PC1:/home/test# date +%Y ##年 2022 root@PC1:/home/test# date...