bash通配符≠RegEx
如星号*的区别
依照严谨程度分为基础正则表达式和扩展正则表达式
语系对正则表达式的结果有影响
要留意当前环境的语系
一般采用C语系或en等英文语系
正则表达式需要工具程序辅助才能实现
特殊符号
[:alnum:]:(alpha & number)[0-9A-Za-z]
[:alpha:]:[A-Za-z]
[:blank:]:空格或[tab]
[:cntrl:]:(control)键盘上的控制按钮CR,LF,TAB,DEL等
[:digit:]:[0-9]
[:graph:]:除了[:blank:](空格符)外的其他所有按键
[:lower:]:[a-z]
[:print:]:任何可打印字符
[:punct:]:(punctuation symbol)标点符号
[:upper:]:[A-Z]
[:space:]:任何会产生空白的字符(包含[:blank:])空格键、tab、CR等
[:xdigit:]:十六进制数字符[0-9a-fA-F]
grep的高级参数
基本语法:grep [-A] [-B] [--color=auto] '搜寻字符串' filename
-A:(after) 后接数字,表示除了列出匹配行外,后续几行也列出来
-B:(before)后接数字,表示除了列出匹配行外,前面几行也列出来
--color=auto:匹配数据显示特殊颜色
基础正则表达式字符
^word:待查找的字符串word在行首
word$:待查找的字符串word在行尾
.:一个任意字符
\:转义字符
*:前一个字符重复0~∞次
[list]:list中的字符集中的任意一个字符
[n1-n2]:字符集中使用范围
[^list]:反向选择
\{n,m\}:前一个字符重复n~m次
此处用了转移,是因为bash下花括号{}代表了命令块
sed工具:管道命令之一
用于分析stdin
基本语法:sed [-nefr] [动作]
-n:(silent)安静模式,只显示被处理的行
默认显示所有行
-e:直接在命令行模式上进行sed的动作编辑
-f:后接filename,引用filename文件来作为[动作]
-r:使用扩展正则表达式
默认为基础正则表达式
-i:直接修改文件,不输出到屏幕(危险操作)
一般用来修改、替换大文件的内容
比如100W行的文件,用vim是不合理的
[动作]说明:
格式:[n1 [,n2] ] function
n1,n2:为进行function操作的行范围,$可以代表最后一行
function:
a:新增,后接字符串,会出现在n1的下一行(此时不需要n2)
若要新增多行,可以用反斜杠(\)转移回车[Enter]
c:替换,后接字符串,用该字符串替换n1-n2行的内容
d:删除,通常不接参数
i:插入,后接字符串,会出现在n1的上一行(此时不需要n1)
p:打印,打印出所选择的行(一般与-n一起用)
s:替换,可以通过正则表达式匹配替换字符串
形式:n1,n2s/OLDSTR/NEWSTR/g
将n1-n2间OLDSTR匹配的字符串替换为NEWSTR字符串
扩展正则表达式
+:前一个字符重复1~∞次
?:前一个字符重复0~1次
|:用或(or)的方式找出数个字符串
如aaa|bbb可以匹配aaa或bbb
():分组
grep只支持基础正则表达式,egrep支持扩展正则表达式
printf:格式化打印
基本语法:printf '打印格式' 实际内容
打印格式(类似C语言):
\a:警告声音输出
\b:退格键
\f:清屏
\n:换行
\r:回车键
\t:水平[tab]
\v:垂直[tab]
\xNN:NN为两位数字,转换为对应ASCII码的字符
%ns:
%ni
%N.nf
如:printf '%s\t %s\t %s\t %s\t \n' $(cat printf.txt)
awk:小型数据处理工具
将一行分为多个“字段”处理,默认分隔符为空格或[tab]
基本语法:awk '条件类型1{动作1} 条件类型2{动作2} .....' filename
若不给出条件类型,则直接执行动作
内置变量
$0,$1,$2等
NF:该行拥有的字段总数
NR:当前为第几行
FS:分隔符,默认为空格
运算符
> < >= <= == !=
设置变量
直接用等号赋值即可
条件类型关键字BEGIN和END
可以使awk开始读取数据前做预处理,或读取所有数据后做后续处理
如:改变分隔符
cat /etc/passwd | awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t" $3}'
注意
动作内的命令可以有多个,用分号(;)来分隔,也可以直接用[Enter]隔开
变量直接使用,无需加前导符$
动作内是支持if语句的,因此条件类型也可以放入动作中
工作流程
读入第一行,将该行的数据填入$0,$1,$2等变量
$0代表整行,其余代表第几字段
依据条件类型的限制,判断是否需要进行总做
做完所有的动作和条件类型
处理后续的行
纯文本比较、目录比较:diff
以行为单位
基本用法:diff [-bBi] from-file to-file
from-file:欲做比较的文件
to-file:目的比较文件
也可以用减号-表示stdin
-b:忽略多个空白的区别
-B:忽略空白行的区别
-i:忽略大小写的区别
也可以直接比较目录间的区别
二进制文件比较:cmp
以字节为单位
基本语法:cmp [-s] file1 file2
-s:列出所有不同点处的字节处
默认值列出第一个不同点
diff + patch:补丁制作与还原
制作补丁文件:diff -Naur OLDFILE NEWFILE > FILE.patch
比较新旧文件NEWFILE和OLDFILE,制作不定文件FILE.patch
更新文件:patch -pN < FILE.patch
新旧文件信息会记录在FILE.patch中,包括文件名
执行该命令后会将OLDFILE的内容更新为NEWFILE的内容(文件名不变)
-p:取消N层目录(用于整个目录的补丁)
同一目录下直接使用-p0即可
还原文件:patch -R -pN < FILE.patch
执行该命令后会将NEWFILE的内容还原为OLDFILE的内容(文件名不变)
-R:代表还原
文件打印准备:pr
略