Linux--正则表达式,grep,操作文本命令

1. 正则表达式

1.1 基本正则

正则表达式说明
^行首
$行尾
.匹配任意一个字符
[]匹配包含在[字符]之中的任意一个字符
[^]匹配除[^字符]之外的任意一个字符
[-]匹配[]中指定范围内的任意一个字符
?匹配项1次或0次
+匹配1次或多次
*匹配0次或多次
()创建一个用于匹配的子串
{n}匹配之前的项n次
{n,}之前的项至少匹配n次
{n,m}指定之前的项所必须匹配的最小次数和最大次数
|交替–匹配|两边的任意一项
\转义字符

1.2 POSIX字符类

形如[:…:]的特殊元序列,可以匹配特定的字符范围

正则表达式描述
[:alnum:]字母与数字字符
[:alpha:]字母字符
[:blank:]空格与制表符
[:digit:]数字字符
[:lower:]小写字母
[:upper:]大写字母
[:punct:]标点符号
[:space:]包括换行符、回车等在内的所有空白字符

1.3 元字符

元字符是Perl风格的正则表达式,只有一部分文本处理工具支持它

正则表达式描述
\b单词边界
\B非单词边界
\d单个数字字符
\D单个非数字字符
\w单个单词字符(字母、数字与_)
\W单个非单词字符
\n换行符
\s单个空白字符
\S单个非空白字符
\r回车

2. 操作文本的程序

2.1 grep:行搜索器

在文件中搜索文本,行搜索器

用法:

[root@linux ~]# grep [-cinv] ‘搜寻字符串’ filename
参数:
-o,只显示匹配到的文本部分
-v,打印除匹配行以外的所有行
-c,打印匹配行的数量
-n,打印匹配行的行号
-b,打印匹配字符所在行的偏移字符或字节(和-o配合使用)
-l,搜索多个文件,显示匹配文本的文件名
-R,递归搜索文件
-i,忽略样式中的大小写
-A #,打印匹配文本之后的#行
-B #,打印匹配文本之前的#行
-C #,打印匹配文本之前以及之后的#行

实例:

#显示匹配的行内容
[root@localhost gpadmin]# grep gpadmin /etc/passwd
gpadmin:x:530:530::/home/gpadmin:/bin/bash
#显示匹配的内容
[root@localhost gpadmin]# grep -o gpadmin /etc/passwd
gpadmin
gpadmin
#显示匹配的内容及其行号
[root@localhost gpadmin]# grep -on gpadmin /etc/passwd
34:gpadmin
34:gpadmin
#显示匹配到该字符的文件名
[root@localhost gpadmin]# grep -l gpadmin /etc/passwd /etc/shadow
/etc/passwd
/etc/shadow
#显示出没有匹配到该字符的文件
[root@localhost gpadmin]# grep -L gpadmin /etc/passwd /etc/shadow /etc/init
/etc/init.conf
#显示目录下匹配到的文件名
[root@localhost gpadmin]# grep -rl gpadmin /etc/
/etc/gshadow
/etc/passwd
/etc/group
/etc/shadow
#排除/etc/group文件
[root@localhost gpadmin]# grep  --exclude=*group -rl gpadmin /etc/
/etc/gshadow
/etc/passwd
/etc/shadow

2.2 cut:按列操作

按列切分文件
用法:

[root@linux ~]# cut -d’分隔字符’ -f fields [file or stdin]
[root@linux ~]# cut -c 字符区间 [file or stdin]
参数:
-c,指定截取的字符数
-d,指定截取的分隔符
-f,指定截取的列
截取的范围:
N:截取第N列(字节,字符)
N-:截取从第N列(字节,字符)之后的列(字节,字符)
N-M:截取第N列(字节,字符)到M列(字节,字符)
N,M:截取第N,M列(字节,字符)
–output-delimiter,指定输出的分隔符

实例:

#以冒号为分隔符,取第1和3列的内容,修改输出分隔符
[root@localhost gpadmin]# echo $PATH | cut -d":" -f1,3 --output-delimiter="  |  "
/usr/local/greenplum-db/./bin  |  /usr/local/greenplum-db/./bin
#以冒号为分隔符,取第1到3列的内容,修改输出分隔符
[root@localhost gpadmin]# echo $PATH | cut -d":" -f1-3 --output-delimiter="  |  "
/usr/local/greenplum-db/./bin  |  /usr/local/greenplum-db/./ext/python/bin  |  /usr/local/greenplum-db/./bin
#输出第12位到20位字符
[root@localhost gpadmin]# echo $PATH | cut -c 12-20
greenplum

2.3 sort:排序

以行为单位,进行排序等操作。
用法:

[root@linux ~]# sort [-fbMnrtuk] [file or stdin]
参数:
-f :忽略大小写的差异
-b :忽略最前面的空格符部分
-M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法
-n :使用纯数字进行排序
-r :反向排序
-u :去除重复
-t :分隔符,默认是 tab 键
-k :以那个区间 (field) 来进行排序

实例:

#通过冒号分隔,以第三个分隔进行排序
#默认以字符串的形式进行排序
[root@localhost tmp]# head /etc/passwd | sort -t':' -k3
root:x:0:0:root:/root:/bin/bash
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
#通过数字形式来排序
[root@localhost tmp]# head /etc/passwd | sort -t':' -k3 -n
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

2.4 uniq:去重

用法:

[root@linux ~]# uniq [-ic]
参数:
-i :忽略大小写字符的不同
-c :进行计数

实例:

#取出账号名排序并去重
[root@localhost tmp]# last | cut -d ' ' -f1 |sort |uniq
 
gpadmin
reboot
root
wtmp
#取出账号并计算出每个用户的登入总次数
[root@localhost tmp]# last | cut -d ' ' -f1 |sort |uniq -c
      1 
     24 gpadmin
      6 reboot
      9 root
      1 wtmp

2.5 wc:计数

用法:

[root@linux ~]# wc [-lwm]
参数:
-l :仅列出行
-w :仅列出多少字
-m :多少字符

实例:

#last中有少行、字数、字符数
[root@localhost tmp]# last | wc
     41     402    3041
     行      字数    字符数
#去除包含pgadmin的行的总数
[root@localhost tmp]# last | grep [a-zA-Z]|grep -v 'gpadmin' |wc -l
16

2.6 tee:双向重导向

用法:

[root@linux ~]# tee [-a] file
参数:
-a :以累加 (append) 的方式,将数据加入 file 当中

实例:

#将 last 的输出存一份到 last.list 文件中
[root@linux ~]# last | tee last.list | cut -d " " -f1
# 将 ls 的数据存一份到 ~/homefile ,同时输出到屏幕
[root@linux ~]# ls -l /home | tee ~/homefile | more
#在文件中追加
[root@linux ~]# ls -l / | tee -a ~/homefile | more

2.7 tr:删除或替换文本

用法:

[root@linux ~]# tr [-ds] SET1 …
参数:
-d :删除讯息当中的 SET1 这个字符串
-s :取代掉重复的字符

实例:

#将 last 输出的讯息中,所有的小写变成大写字符:
[root@linux ~]# last | tr '[a-z]' '[A-Z]'
#将 /etc/passwd 输出的讯息中,将冒号删除
[root@linux ~]# cat /etc/passwd | tr -d ':'

2.8 join:整合文件

join比对两个文件,将相同行拼接在一起。
用法:

[root@linux ~]# join [-ti12] file1 file2
参数:
-t :join 默认以空格符分隔数据,并且比对第一个字段的数据,
如果两个文件相同,则将数据联成一行,且第一个字段放在第一个
-i :忽略大小写的差异
-1 :这个是数字的 1 ,代表第一个文件要用那个字段来分析的意思
-2 :代表第二个文件要用那个字段来分析的意思

实例:

#将 /etc/passwd 与 /etc/shadow 相关数据整合成一栏
[root@localhost tmp]# join -t ':' /etc/passwd /etc/shadow | head -n5
root:x:0:0:root:/root:/bin/bash:$6$WzF.cG7e8CjwRriy$ZlKhnum/naKODOBvk1laxIijrHN.Hxf421B6G9.pCeS5ASemP105y8R1dripeAA9o.JN4o6tWwdJrTS.qfFku1:17830:0:99999:7:::
bin:x:1:1:bin:/bin:/sbin/nologin:*:15980:0:99999:7:::
daemon:x:2:2:daemon:/sbin:/sbin/nologin:*:15980:0:99999:7:::
adm:x:3:4:adm:/var/adm:/sbin/nologin:*:15980:0:99999:7:::
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin:*:15980:0:99999:7:::
#/etc/passwd 第四个字段是 GID ,那个 GID 记录在/etc/group 当中的第三个字段,将这两个文件进行整合
[root@localhost tmp]# join -t ':' -1 4 /etc/passwd -2 3 /etc/group | head -n5
0:root:x:0:root:/root:/bin/bash:root:x:
1:bin:x:1:bin:/bin:/sbin/nologin:bin:x:bin,daemon
2:daemon:x:2:daemon:/sbin:/sbin/nologin:daemon:x:bin,daemon
4:adm:x:3:adm:/var/adm:/sbin/nologin:adm:x:adm,daemon
7:lp:x:4:lp:/var/spool/lpd:/sbin/nologin:lp:x:daemon

2.9 paste:合并文件

paste直接将两个文本拼接在一起,中间以tab键来分隔。
用法:

[root@linux ~]# paste [-d] file1 file2
参数:
-d :后面可以接分隔字符。默认是以 [tab] 来分隔的
- :如果 file 部分写成 - ,表示来自 standard input

实例:

#将 /etc/passwd 与 /etc/shadow 同一行贴在一起,中间以tab为分隔符
[root@localhost tmp]# paste /etc/passwd /etc/shadow | head -n 5
root:x:0:0:root:/root:/bin/bash root:$6$WzF.cG7e8CjwRriy$ZlKhnum/naKODOBvk1laxIijrHN.Hxf421B6G9.pCeS5ASemP105y8R1dripeAA9o.JN4o6tWwdJrTS.qfFku1:17830:0:99999:7:::
bin:x:1:1:bin:/bin:/sbin/nologin        bin:*:15980:0:99999:7:::
daemon:x:2:2:daemon:/sbin:/sbin/nologin daemon:*:15980:0:99999:7:::
adm:x:3:4:adm:/var/adm:/sbin/nologin    adm:*:15980:0:99999:7:::
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin        lp:*:15980:0:99999:7:::

2.10 split:分割

用法:

[root@linux ~]# split [-bl] file PREFIX
参数:
-b :后面可接欲分割成的文件大小,可加单位,例如 b, k, m 等
-l :以行数来进行分割

实例:

# /etc/termcap 有七百多 K,若想要分成 300K 一个档案时
[root@linux ~]# cd /tmp; split -b 300k /etc/termcap termcap
[root@linux tmp]# ls -l termcap*
-rw-rw-r-- 1 root root 307200 817 00:25 termcapaa
-rw-rw-r-- 1 root root 307200 817 00:25 termcapab
-rw-rw-r-- 1 root root 184848 817 00:25 termcapac

2.11 xargs:参数代换

用法:

[root@linux ~]# xargs [-0epn] command
参数:
-0 :如果输入的 stdin 含有特殊字符,例如 `, , 空格键等等字符时,这个 -0 参数
可以将他还原成一般字符。
-e :这个是 EOF (end of file) 的意思。后面可以接一个字符串,当 xargs 分析到这个字符串时,就会停止继续工作
-p :在执行每个指令的 argument 时,都会询问使用者的意思
-n :后面接次数,每次 command 指令执行时,要使用几个参数的意思

2.12 diff:比对文件

diff 就是用在比对两个档案之间的差异的,一般是用在 ASCII 纯文字文件的比对上
用法:

[root@linux ~]# diff [-bBi] from-file to-file
参数:
from-file :源文件名
to-file :对比文件名
注意,from-file 或 to-file 可以 - 取代,那个 - 代表『Standard input』之意。
-b :忽略一行当中,仅有多个空白的差异
-B :忽略空白行的差异
-i :忽略大小写的不同

2.13 cmp:比对文件

diff以行为单位比对,cmp以位为单位比对
用法:

[root@linux ~]# cmp [-s] file1 file2
参数:
-s :将所有的不同点的位处都列出来。因为 cmp 预设仅会输出第一个发现的不同点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值