- 1.1 正则表达式介绍
正则表达式定义(regular expression):通过一些特殊字符得排列,用以查找替换删除一行或多行文字字符串,是一种字符串处理得标准依据。支持正则表达式得工具有:vi sed awk.,grep.但是cp ls 这些命令并不支持正则表达式。
- 1.2 基础正则表达式
grep 高级参数
grep [-A][-B] ‘搜寻的字符串’ filename
-A:后面可加数字,为after得意思,除了列出改行外,后续得n行也列出来
-B:后面可加数字,为befer意思,除了列出改行外,前面得n行也列出来
例如:dmesg | grep -n --color=auto ‘eth’ dmesg是获取内核信息得命令,获取内核信息中关于网卡得,并且要关键字显示颜色。-n 是顺便输出行号,整个用法说明功能类似于 ps-ef|grep 。。。
假如每次使用grep 中得–color=auto 输入很麻烦,可以写进环境变量.cshrc中。
alias grep =‘grep --color=auto’,再使环境变量生效即可
练习一:查找特定字符串
(1)查找特殊字符grep -n ‘the’ regular_express.txt
(2)反向查找,-v代表得是反向选择没有字符得那几行grep -vn ‘the’ regular_express.txt
(3)不论大小写查找grep -in ‘the’ regular_express.txt,-i是忽略大小写
练习二:利用中括号查找集合字符
(1)查找test或者taste两个单词,他们有共同点 t?st
grep -n ‘t[ae]st’ regular_express.txt
(2)查找有’oo’得字符
grep -n ‘oo’ regular_express.txt
(3)查找oo前面不带g得字符呢,可以用集合字符得反向选择[^]来完成
grep -n ‘[^g]oo’ regular_express.txt
(4)查找’oo’前面不想要小写字符,
grep -n ‘[1]oo’ regular_express.txt
参考语系用法
[:lower:]小写 [:upper:]大写 [:digit:]数字
(5)查找有数字得一行
grep -n ‘[[:digit:]]’ regular_express.txt
grep -n ‘[0-9]’ regular_express.txt
练习三:行首与行尾字符^$
(1)查找’the’只在行首出现
grep -n ‘^the’ regular_express.txt
(2)查找开头字母行首是小写
grep -n ‘2’ regular_express.txt
grep -n ‘3’ regular_express.txt
(3)查找行尾结束为小数点(.)的那一行
grep -n ‘.KaTeX parse error: Expected group after '^' at position 82: …格一行 grep -n '^̲’ regular_express.txt
练习四:任意一个字符.与重复字符*
点号:代表一定有一个任意字符的意思
星号:代表重复前一个0到无穷多次的意思,为组合形态
(1)查找g??d的字符串
grep -n ‘g…d’ regular_express.txt
(2)查找至少包含两个oo以上的字符串
grep -n ‘ooo*’ regular_express.txt
请注意 如果此时是查找 ‘o*’,代表的是具有空字符 或者一个O以上的字符,则会打印全部。
(3)字符串开头与结尾都是g,但是两个g之间至少要存在一个o
grep -n ‘goo*g’ regular_express.txt
(4)查找g开头与g结尾的字符,中间字符可有可无
grep -n ‘g.*g’ regular_express.txt
练习五:限定连续RE字符范围{}
因为{}在shell中有特殊意义,所以需要用转义符来搭配使用
(1)查找有俩个oo的字符
grep -n ‘o{2}’ regular_express.txt
(2)查找g开头的后面接2到五个o,后面接g的字符串
grep -n ‘go{2,5}g’ regular_express.txt
- 1.3 基础正则表达式字符(characters)
^:待查找得字符串再行首
$:行尾
. - []
[n1-n2]
[^]
{n,m} - 1.4 sed工具
sed本身也是管道命令
用法:sed [-nefr] [动作]
-n:使用安静模式,加上-n之后,只有sed处理过得那一行才会被列出来
-e:直接在命令模式下进行sed动作编辑
-f :直接将sed动作写到一个文件里,
-r:sed动作支持拓展型正则表达式
-i:直接修改读取得文件内容,而不是由屏幕输出
动作说明:[n1[,n2]] function
function 有以下几个参数:
a:新增
c:替换
d:删除
i:插入
p:打印
s:替换
(1)练习:列出文件内容并打印行号,同时将2到5行删除
nl命令在linux系统中用来计算文件中行号。nl 可以将输出的文件内容自动的加上行号
nl regular_express.txt | sed -e ‘2,5d’
(2)删除第三行到最后一行
nl regular_express.txt | sed -e '3,
d
′
,
其
中
d',其中
d′,其中代表最后一行
(3)在第二行后加上字符串tea
nl regular_express.txt | sed -e ‘2a tea’
(4)在第二行前加上字符串tea
nl regular_express.txt | sed -e ‘1a tea’
nl regular_express.txt | sed -e ‘2i tea’
(5)将2-5行的内容换成hdd
nl regular_express.txt | sed -e ‘2,5c hdd’
(6)获取文件的11-20行
nl regular_express.txt | sed -n ‘11,20p’
请注意,这时候要用n,是使用安静模式,只展示特殊处理的几行才能展示粗来
(7)sed的查找与替换与vi差不多
sed ’s/要被替换的字符串/新的字符串/g‘
vi 的使用 :n1,n2s/word1/word2/g 查找n1,n2之间的word1,更改成word2
- 1.5 文件的格式化与相关处理
- 1.5.1 格式化打印
- 1.5.2 awk好用的数据处理工具
awk ‘条件类型1{动作1}.。。。。’filename
last -n 5|awk ‘{print $1 “\t” $3}’
last -n 5 是展示前五条数据,后面是打印展示第一行以及第三行数据,\t是相当于空格tab键
awk的内置变量
NF:每一行($0)拥有的字段总数
NR:目前awk所处理的是‘第几行的’数据
FS:目前的分割字符,默认是空格键
比如列出每一行的账号,也就是($1)
列出目前处理的行数
并且说明该行有多少字段
last -n |awk ‘{print $1 ‘’\t lines:’’ NR ‘’\t columes: ‘’ NF}’
awk的逻辑运算符
就是包括大于小于 等于不等于
cat passwd|awk ‘{FS=":"} $3< 10 {print $1 “\t” $3}’
这个案例就是说明 按照冒号进行分割,第三列小于十,列出第三项和第一项
但是第一行root没有展示出来,是因为读入第一行的时候,那些变量默认还是以空格键来分割;以冒号分割只在第二行之后生效。因此可以预先设置awk的变量,利用begin
cat passwd|awk ‘BEGIN{FS=":"} $3< 10 {print $1 “\t” $3}’
- 1.6 文件比较工具
diff 用于比较两个文件之间的差别,以行单位来比较。
diff [-bBi] from_file to_file
from_file:一个文件名,作为预比较文件
to_file:一个文件名,作为母大文件
-b:忽略一行中的空白
-B:忽略空白行
-i:忽略大小写
diff warn_op.ini0408test warn_op.ini
可以比较不同的文件
比如显示26 d27 意思是左边第26行被删除了??好像不太对
cmp也是文件比较,主要单位是按照字节来比较
cmp 【-s】 file1 file2
-s:是将所有不同点的字节处都列出来
patch是补丁的意思,意思是diff比较出来不同的地方 写到patch文件里面,然后补丁文件更新到
patch -pN <patch_file 更新
patch -R -pN <patch_file 还原