Linux命令整理(二)
8、正则表达式与文件格式化处理
8.1、基础正则表达式
特殊符号 | 代表意义 |
---|
[:alnum:] | 代表英文大小写字符及数字,亦即 0-9,A-Z,a-z | [:alpha:] | 代表任何英文大小写字符,亦即 A-Z,a-z | [:blank:] | 代表空格键与 [Tab] 按键两者 | [:cntrl:] | 代表键盘上面的控制按键,亦即包括 CR,LF,Tab,Del … 等等 | [:digit:] | 代表数字而已,亦即 0-9 | [:graph:] | 除了空格符(空格键与 [Tab] 按键)外的其他所有按键 | [:lower:] | 代表小写字符,亦即 a-z | [:print:] | 代表任何可以被打印出来的字符 | [:punct:] | 代表标点符号(punctuation symbol),亦即:‘ “ ? ! ; : # $ … | [:upper:] | 代表大写字符,亦即 A-Z | [:space:] | 任何会产生空白的字符,包括空格键,[Tab],CR 等等 | [:xdigit:] | 代表 16 进位的数字类型,因此包括:0-9,A-F,a-f 的数字与字符 |
8.2、grep 的一些进阶选项
[root@MiWiFi-R4A-srv ~]
选项与参数:
-A : 后面接数字,为 after 的意思,除了列出该行外,后续的 n 行也列出来;
-B : 后面接数字,为 before 的意思,除了列出该行外,前面的 n 行也列出来;
--color=auto : 可将正确的那个列出颜色
基础正则表达式字符汇总
RE 字符 | 意义与示范 |
---|
^word | 意义:待搜索的字符串(word)在行首! 范例:搜寻行首为 # 开始的那一行,并列出行号: grep -n ‘^#’ filename | word$ | 意义:待搜寻的字符串(word)在行尾! 范例:将行尾 ! 的那一行打印出来,并列出行号 grep -n ‘!$’ filename | . | 意义:代表 “一定有一个任意字符” 的字符! 范例:搜寻的字符串可以是(eve)(eae)(eee)(e e),但不能仅有(ee)!亦即:e 与 e 之间 “一定” 仅有一个字符,而空格也是字符! grep -n ‘e.e’ filename | \ | 意义:转义字符,将特殊符号的特殊意义去除! 范例:搜寻含有单引号 ‘ 的那一行! grep -n \’ filename | * | 意义:重复零个到无穷多个的前一个 RE 字符 范例:找出含有(es)(ess)(esss)等等的字符串!注意,因为 * 可以是 0 个,所以 es 也是符合的。任意字符可以是 “.*”! grep -n ‘ess*’ filename | [list] | 意义:字符集合的 RE 字符,里面列出想要的截取的字符! 范例:搜寻含有(gl)或(gd)的那一行,需要特别留意的是,在 [] 当中 “谨代表一个待搜寻的字符”。 grep -n ‘g[ld]’ filename | [n1-n2] | 意义:字符集合的 RE 字符,里面列出想要的截取的字符范围。 范例:搜寻含有任意数字的那一行! grep -n ‘[A-Z]’ filename | [^list] | 意义:字符集合的 RE 字符,里面列出来不要的字符串或范围! 范例:搜寻的字符串可以是(oog)(ood)但不能是(oot)。 grep -n ‘oo[^t]’ filename | \{n,m\} | 意义:连续 n 到 m 个的 “前一个 RE 字符” 意义:若为 \{n\} 则是连续 n 个的前一个 RE 字符 意义:若为 \{n,\} 则是连续 n 个以上的前一个 RE 字符。 范例:在 g 和 g 之间有 2 个到 3 个的 o 存在的字符串,亦即(goog)(gooog) grep -n ‘go\{2,3\}g’ filename |
8.3、sed 工具
[root@MiWiFi-R4A-srv ~]
选项与参数:
-n : 使用安静模式。在一般的 sed 用法中,所有来自 STDIN 的数据一般都会被列出到屏幕上。如果加上 -n 参数后,只有经过处理的那一行才会被列出来
-e : 直接在指令列模式上进行 sed 的动作编辑
-f : 直接将 sed 的动作写在一个文件内
-r : sed 的动作支持的是延伸的正则表达式
-i : 直接修改读取文件内容,而不是屏幕输出
动作说明: '[n1[,n2]]function'(一定要有单引号)
n1,n2 : 不见得存在,一般代表 “选择进行动作的行数”
function:
a : 新增,a 的后面可以接字符串,而这些字符串会在新的一行出现(目前的下一行)
c : 取代,c 的后面可以接字符串,这些字符串可以取代 n1,n2 之间的行
d : 删除
i : 插入,i 后面可以接字符串,而这些字符串会在新的一行出现(目前的上一行)
p : 打印,通常 p 会将参数 sed -n 一起出现
s : 取代,可以直接进行取代的工作。通常这个 s 的动作可以搭配正则表达式
sed 's/要被取代的字符串/新的字符串/g'
8.4、延伸的正则表达式
grep 预设仅支持基础正则表达式,如果想要使用延伸的正则表达式,可以使用延伸的正则表达式:
RE 字符 | 意义与范例 |
---|
+ | 意义:重复 “一个或一个以上” 的前一个 RE 字符 范例:搜寻(god)(good)(goood)… 等等的字符串。那个 o+ 代表 “一个以上的 o” 。 egrep -n ‘go+d’ filename | ? | 意义:“零个或一个” 的前一个 RE 字符 范例:搜寻(gd)(god)这两个字符串。那个 o? 代表 “空的或 1 个 o”。 egrep -n ‘go?d’ filename | | | 意义:用或(or)的方式找出数个字符串 范例:搜寻 gd 或 good 这两个字符串,注意,是 “或”! egrep -n ‘gd|good’ filename | () | 意义:找出 “群组” 字符串 范例:搜寻(gald)或(good)这两个字符串,因为 g 与 d 是重复的 egrep -n ‘g(la|oo)d’ filename | ()+ | 意义:多个重复群组的判别 范例:将 “AxyzxyzxyzxyzC” 用 echo 叫出 echo ‘AxyzxyzxyzxyzC’ | egrep ‘A(xyz)+C’ |
9、文件格式化与相关处理
9.1、格式化打印:printf
[root@MiWiFi-R4A-srv ~]
选项与参数:
关于格式方面的几个特殊样式:
\a 警告声音输出
\b 退格键
\f 清除屏幕
\n 输出新的一行
\r 即 Enter 键
\t 水平的 tab 键
\v 垂直的 tab 键
\xNN NN 为两位数字,可以转换数字为字符
关于 C 语言内,常见的变数格式:
%ns 那个 n 是数字,s 代表 string,即多少字符
%ni 那个 n 是数字,i 代表 int,即多少整数字数
%N.nf 小数
9.2、awk:好用的数据处理工具
[root@MiWiFi-R4A-srv ~]
awk 主要是处理 “每一行的字段内的数据”,而默认的 “字段的分隔符为 “空格键” 或 “[tab]键” ”。
[root@MiWiFi-R4A-srv ~]
root pts/0 10.0.0.100 Fri Aug 7 08:26 still logged in
reboot system boot 3.10.0-1127.el7. Fri Aug 7 08:24 - 09:04 (00:39)
root pts/0 li-911m.lan Thu Aug 6 15:40 - crash (16:44)
reboot system boot 3.10.0-1127.el7. Thu Aug 6 15:40 - 09:04 (17:23)
root pts/0 li-911m.lan Thu Aug 6 08:56 - crash (06:43)
[root@MiWiFi-R4A-srv ~]
root 10.0.0.100
reboot boot
root li-911m.lan
reboot boot
root li-911m.lan
整个 awk 的处理流程:
- 读入第一行,并将第一行的资料填入 $0,$1,$2,…当中;
- 依据 “条件类型” 的限制,判断是否需要进行后面的 “动作”;
- 做完所有的动作与条件类型;
- 若还有后续的 “行” 的数据,则重复前面的 1~3 步骤,直到所有的数据全部读完为止。
awk 是 “以行为一次处理的单位”,而 “以字段为最小的处理单位”。那 awk 怎么知道这个数据到底有几行?这就需要 awk 的内建变量的帮忙:
变量名称 | 说明 |
---|
NF | 每一行($0)拥有的字段总数 | NR | 目前 awk 所处理的是 “第几行” 的意思 | FS | 目前的分隔字符,默认是空格 |
awk 的逻辑运算符:
运算单元 | 说明 |
---|
> | 大于 | < | 小于 | >= | 大于等于 | <= | 小于等于 | == | 等于 | != | 不等于 |
9.3、文件比对工具
-
diff diff 就是比对两个文件的差异,并且是以行为单位来比对的!一般用在 ASCII 纯文本文件的比对上。由于是以行为单位进行比对的,因此 diff 通常是用在同一文件(或软件)的新旧版本差异上。 [root@MiWiFi-R4A-srv ~]
选项与参数:
from-file : 原始比对文件
to-file : 目的比对文件
from-file 或 to-file 可以用 - 取代
-b : 忽略一行当中,仅有多个空白的差异
-B : 忽略空白行的差异
-i : 忽略大小写的差异
-
cmp cmp 主要是以字节来比较。 [root@MiWiFi-R4A-srv ~]
选项与参数:
-l : 将所有不同点的字节列出来。因为 cmp 默认仅列出第一个不同点
-
patch patch 与 diff 之间密不可分。diff 用来比较两个文件之间的差异,那如何升级呢?就是 “先比较新旧版本的差异,并将差异文档做成补丁,再由补丁更新旧文件” 即可。 范例一:以 /tmp/testpw 内的 passwd.old 与 passwd.new 制作补丁文件
[root@MiWiFi-R4A-srv ~]
[root@MiWiFi-R4A-srv ~]
--- passwd.old 2020-08-07 09:29:25.309779367 +0800 <== 新旧文件的信息
+++ passwd.new 2020-08-07 09:30:05.133777094 +0800
@@ -1,9 +1,8 @@
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
+no six line
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@MiWiFi-R4A-srv ~]
[root@MiWiFi-R4A-srv ~]
选项与参数:
-p : 后面接 “取消几层目录” 的意思
-R : 代表还原,将新的文件还原成原来旧的版本
[root@MiWiFi-R4A-srv ~]
patching file passwd.old
[root@MiWiFi-R4A-srv ~]
-rw-r--r--. 1 root root 778 8月 7 09:30 passwd.new
-rw-r--r--. 1 root root 778 8月 7 09:43 passwd.old
[root@MiWiFi-R4A-srv ~]
patching file passwd.old
[root@MiWiFi-R4A-srv ~]
-rw-r--r--. 1 root root 778 8月 7 09:30 passwd.new
-rw-r--r--. 1 root root 835 8月 7 09:44 passwd.old
10、学习 Shell Scripts
|