存疑概念:
。管线命令
提醒:
。正规表示法的特殊字符与一般在指令列输入指令的通配符并不相同
。awk中自定义FS(分隔符)时,需要使用BEGIN,否则定义分隔符对第一行无效
重要知识点:
第十一章 正规表示法与文件格式化处理
11.1 开始之前:什么是正规表示法
。正规表示法
就是处理字符串的方法,以行为单位来进行字符串的处理行为(通过使用一些特殊符号的辅助)
一种表示法
*正规表示法与通配符是完全不一样的东西
通配符是bash操作的一个接口
正规表示法是一种字符串的处理方式
11.2 基础正规表示法
11.2.1语系对正规表示法的影响
。语系会对编码产生影响
11.2.2grep的一些进阶选项
grep -A -B --color=auto '搜寻字符串' filename
-A 后面加数字。为after的意思,除了列出该行,后续的n行也列出来
-B 后面加数字。为befer的意思,与以上功能相似
--color=auto 可将正确的那个撷取数据列出颜色
例子
dmesg | grep -n -A3 -B2 --color=auto 'tun'
11.2.3基础正规表示法练习
例1:搜寻特定字符串
grep -n 'the' filename
反向选择,没有关键词的行数
grep -vn 'the' filename
忽略大小写
grep -in 'the' filename
例2:利用中括号搜寻集合字符
grep -n 't[ea]st' filename
grep -n '[^g]oo' filename
非小写字母
grep -n '[^a-z]oo' filename;grep -n '^[:lower:]oo' filename
例3:行首与行尾字符
grep -n '^the' filename //与[^]不同,此为制表符,撷取行开头为the的行
grep -n '^[a-z]' filename //撷取行开头为小写字母的行
grep -n '^[:lower:]' filename
grep -n '\.$' filename //撷取行尾不为.的行
例4:任意一个字符.与重复字符*
字符+*,代表空字符或一个以上同样字符
例5:限定连续RE字符范围{}
grep -n 'o\{2\}' filename //有两个o的行
grep -n 'o\{2,5\}' filename //有两个到五个以上o的行
11.2.5sed工具
sed [-nefr] [动作]
-n 使用安静模式。一般用法,所有来自STDIN的数据一般都会被列在屏幕上。加-n后,只有经过sed特殊处理的那一行会被列出
-e 直接在指令列模式上进行sed的动作编辑
-f 直接将sed的动作写在一个文件内,-f filename则可以使用filename内的sed命令
-r sed的动作支持的是延伸型正规表示法(预设为普通型)
-i 直接修改读取的文件内容,而不是屏幕输出
动作说明:
[n1[,n2]]function
n1,n2:不一定会存在,一般代表选择进行动作的行数,举例
若我的动作是需在10到20行之间进行的,则10,20动作行为
function:
a 新增,a后接字符串,这些字符串会在新的一行出现(目前的下一行)
c 取代,c后接字符串,这些字符串可以取代n1,n2之间的行
d 删除,d后一般无东西
i 插入,i后接字符串,字符串出现在新的一行(目前的上一行)
p 打印,将某个选择的数据印出。通常会与sed -n一起运作
s 取代,直接进行取代工作
。以行为单位新增/删除
nl /etc/passwd | sed '2,5d' //删除2~5行后,打印
nl /etc/passwd | sed '2a drink tea' //第二行后加新增行drink tea
。以行为单位的取代与显示
nl /etc/passwd | sed '2,5c No 2-5 Num' //No Num取代2~5行,成一行
nl /etc/passwd | sed -n '2,5p' //不加-n,会列出passwd和2~5行
。部分数据的搜寻并取代
sed 's/要被取代的字符/新的字符串/g'
。直接修改文件内容
sed -i 's/要被取代的字符/新的字符串/g' filename //直接修改,无屏幕输出
sed -i '$a #This is a test' filename //直接修改,$代表最后一行,a为新增
11.3 延伸的正规表示法
+ 重复一个或一个以上的前一个RE字符
? 零个或一个的前一个字符
| 用or的方式找出数个字符串
() 找出群组字符串
egrep -n 'g(la|oo)d' filename
()+ 多个重复群组的判别
egrep -n 'g(oo)+d' filename
11.4 文件的格式化与相关处理
11.4.1格式化打印:printf
printf '打印格式' 实际内容
选项与参数:
关于格式方面的几个特殊样式:
\a 警告声音输出
\b 退格键
\f 清除屏幕
\n 输出新的一行
\r 亦即Enter按键
\t 水平的tab按键
\v 垂直的tab按键
\xNN NN为两位数字,可以转换为字符
关于C程序语言内,常见的变数格式
%ns n为数字,s代表string,即多少个字符
%ni n为数字,i代表int,即多少整数字数
%N.nf n/N都为数字,f为浮点数,例子
若共要十个位数,但小数点有两位,即%10.2f
11.4.2awk:好用的数据处理工具
awk '条件类型1{动作1} 条件类型2{动作2} ...' filename
主要处理每一行的字段内数据,而默认的字段分割符为空格键或tab键
last -n 5 | awk '{print $1 "\t" $3}'
每一行的每个字段都有变量名称,即$1,$2,$3,$4...
流程
1.读入第一行,并将第一行的资料填入,$1,$2,$3...等变数中
2.根据条件间类型的限制,判断是否需要进行后面动作
3.做完所有的动作与条件的类型为止
4.若还有后续的行数据,重复以上1~3步骤,直到所有数据读完
。awk的逻辑运算字符
>
<
>=
<=
==
!= 以上与通常功能相似
。awk中使用运算
cat pay.txt | awk 'NR==1{printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total"}
> NR>=2{total=$2+$3+$4
> printf "%10s %10d %10d %10d %10.2f\n",$1,$2,$3,$4,total}'
1.awk指令间隔:所有awk的动作,如果需要多个指令辅助时,可利用';',或者直接以Enter按键隔开指令
2.格式化输出时,必须加\n,才能分行
3.awk中可直接使用变量,不必加$
11.4.3文件对比工具
。diff(通常用作在同一文件/软件的新版本与原始文档的差异)
diff [-bBi] from-file to-file
*from-file可以-取代,-表示STDIN
-b 忽略一行当中,仅有多个空白的差异
-B 忽略空白行差异
-i 忽略大小写不同
。cmp(主要利用字节单位比对,diff以行)
cmp [-l] file1 file2
。patch(将旧的文件升级为新的文件,与diff密不可分)
12.4.4文件打印准备:pr