文章目录
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 8 月 17 00:25 termcapaa
-rw-rw-r-- 1 root root 307200 8 月 17 00:25 termcapab
-rw-rw-r-- 1 root root 184848 8 月 17 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 预设仅会输出第一个发现的不同点。