Linux鸟哥私房菜学习笔记_第十二章 正规表示法与文件格式化处理

来源:互联网 发布:淘宝美工详情图价格 编辑:程序博客网 时间:2024/06/05 15:33
grep进阶
grep [-A][-B][--color=auto] 'string' filename
-A :后面可加数字,为after的意思,除了列出该行外,后续的n行也列出来
-B :后面可加数字,为before的意思,除了列出该行外,前面的n行也列出来
--color=auto :可将正确的那个截取数据列出颜色
dmesg |grep 'eth' :用dmesg列出核心讯息,再以grep找出内含eth那行
dmesg |grep -n --color=auto 'eth' :查找eth字符串,并用颜色标注,且加上行号
dmesg |grep -n -A1 -B1 --color=auto 'eth' :在上个命令结果上,列出先后行
grep -vn 'hello' regular_express.txt :查询hello.txt中不包含hello行
grep -in 'hello' regular_express.txt :查询hello.txt中包含hello的行,hello不区分大小写
grep -n 't[ae]st' regular_express.txt :查询文件中包含tast和test的行
grep -n 'oo' regular_express.txt :查询文件中包含oo的行
grep -n '[^g]oo' regular_express.txt :查询包含oo的行,并且oo前面不能是g
grep -n '[^a-z]oo' regular_express.txt :查询包含oo的行,并且oo前面不能包含小写字母
grep -n '[^[:lower:]]oo' regular_express.txt :同上一条
grep -n '[0-9]' regular_express.txt :查找包含有数字的行
grep -n '[[:digit:]]' regular_express.txt:同上一条
常用特殊符号如下:
[:alnum:] :代表英文大小写字符及数字,亦即0-9,A-Z,a-z
[:alpha:] :代表任何英文大小写字符
[:blank:] :代表空格键与TAB按键两者
[:cntrl:] :代表键盘上的控制按键,亦即包括CR,LF,TAB,DEL
[:digit:] :代表数字而已,亦即0-9
[:graph:] :除了空格符(空格键与TAB键)外的其他所有按键
[:lower:] :代表小写字符
[:print:] :代表任何可以被打印出来的字符
[:punct:] :代表标点符号
[:upper:] :代表大写字符
[:space:] :任何会产生空白的字符
[:xdigit:] :代表16进位的数字类型
. :一定有一个任意字符
* :重复前一个0到无穷多次
grep -n '^the' regular_express.txt :查询行首带the的行
grep -n '^[a-z]' regular_express.txt :查询行首是小写字母开头的行
grep -n '^[^a-zA-Z]' regular_express.txt :查找行首不是字母的行
grep -n '\.$' regular_express.txt :查询行尾以点结束的行
grep -n '^$' regular_express.txt :查询空白行
grep -v '^$' /etc/syslog.conf | grep -v '^#' :查询不包含空白行和以#开头的行
grep -n 'g..d' regular_express.txt :查询g??d的行
grep -n 'goo*g' regular_express.txt :查询开头与结尾都是g,中间至少有一个o
grep -n 'g*g' regular_express.txt :查找g开头与结尾的字符串
grep -n 'g.*g' regular_express.txt :查找g...g
grep -n '[0-9][0-9]*' regular_express.txt :查找包含任意数字的行
{} :字符范围限定符,{与}是特殊符号,因此使用时需要使用转义字符,
grep -n 'o\{2\}' regular_express.txt :查找包含两个o的字符串
grep -n 'go\{2,5\}g' regular_express.txt :查找g后面接2到5个o,在接一个g的字符串
总结:特殊字符
^word :待搜索的字符串word在行首
word$ :待搜索的字符串在行尾
. :一定有一个任意字符
\ :跳脱字符,把特殊符号的特殊意义去掉
* :重复0到无穷多个前一个RE字符
[list] :字符集合的RE字符,里面列出想要撷取的字符
[n1-n2] :字符集合的RE字符,里面列出想要撷取的字符范围
[^list] :字符集合的RE字符,里面列出不要的字符串或范围
\{n,m\} :连续n到m个的【前一个RE字符】
ls |grep -n '^a.*' :列出以a开头的档案,ls 不支持正则表达式

sed [-nefr] [动作]
选项与参数:
-n :使用安静模式,在一般sed的用法中,所有来自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 :新增,后面接字符串,而这些字符串会在新的一行出现
c :取代,c的后面可以接字符串,这些字符串可以取代n1,n2之间的行
d :删除,d后面通常不接任何东东
i :插入,i后面可以接字符串,而这些字符串会在新的一行出现
p :打印,亦即将某个选择的数据印出,通常p会与参数sed -n一起运作
s :取代,可以直接进行取代,比如1,20s/old/new/g
sed后面接的动作务必以两个单引号括住
nl /etc/passwd |sed '2,5d' :将/etc/passwd的内容列出来并且打印行号,同时将2~5行删除
nl /etc/passwd |sed '2,$d' :将2到最后一行删除
nl /etc/passwd |sed '1d' :删除第一行
nl /etc/passwd |sed '1a drink tea' :在第一行后面加上drink tea(加到第2行)
nl /etc/passwd |sed '1i drink tea' :在第一行前面插入drink tea行
nl /etc/passwd |sed '2a hello\nworld' :在第二行后面加上2行
nl /etc/passwd |sed '1,3c N0.1-3' :替换1-3行字符串为N0.1-3
nl /etc/passwd |sed -n '3,10p' :输出3-10行内容;-n代表静默模式,不加-n会导致3-10行重复输出
ifconfig eth8 |grep 'inet addr' |sed 's/^.*addr://g' |sed 's/Bcast.*$//g' :取出ip地址
sed -i 's/\.$/\!/g' regular_express.txt :将档案中每一行后面的.替换为!
sed -i '$a #This is a test' regular_express.txt :在档案最后一行加入#This is a test
cat passwd |sed -e '4d' -e '6c no six line' >passwd.new :删除第4行,替换第6行为no six line

延伸正规表示法
egrep -v '^$|^#' regular_express.txt 与 grep -v '^$' regular_express.txt | grep -v '^#'相同。
在单引号内的管线意义为【或】
grep预设仅支持基础正规表示法,如果使用延伸型正规表示法可以使用grep -E或egrep
延伸特殊符号:
+  :重复【一个或一个以上】的前一个RE字符
?  :零个或一个的前一个RE字符
|  :用或的方式找出数个字符串
()  :找出【群组】字符串
()+ :多个重复群组的判断
egrep -n 'go+d' regular_express.txt :搜寻(god)(good)等字符串
egrep -n 'go?d' regular_express.txt :搜寻(gd)(god)字符串
egrep -n 'gd|good|dog' regular_express.txt :搜寻gd或good或dog这两个字符串
egrep -n 'g(la|oo)d' regular_express.txt :搜寻glad或good字符串
egrep -n 'A(xyz)+C' regular_express.txt :搜寻以A开头,以C结尾,中间有一个以上的'xyz'
grep -n '[!>]' regular_express.txt :搜寻包含!或>的行
注意:!在正规表示法中并不是特殊字符

格式化打印:printf
printf '打印格式' 实际内容
选项与参数:
\a :警告声音输出
\b :退格键
\f :清除屏幕
\n :输出新的一行
\r :Enter按键
\t :水平的tab按键
\v :垂直的tab按键
\xNN :NN为两位数的数字,可以转换数字成为字符
%ns :n为数字,s为string
%ni :n为数字,i代表integer
%N.nf :n与N都是数字,f代表floating
printf '\x45\n' :打印45 在ASCII表中对应的字母
printf '%10s %5i %5i %5i %8.2f\n' $(cat printf.txt|grep -v Name) :格式化输出
printf '%s\t%s\t%s\t%s\t%s\t\n' $(cat printf.txt) :格式化输出

awk '条件类型1 (动作1) 条件类型2(动作2)...' filename
awk后面接两个单引号并加上大括号{}来设定想要对数据进行的处理动作,awk可以处理后续接的档案,也可以读取来自前个指令的标准输出
$0代表一整列资料
awk是以行为一次处理的单位,以字段为最小的处理单位
awk的指令间隔:所有awk的动作,如果需要多个指令辅助时,可利用;号隔开
格式化输出时,在printf的格式设定中,务必加上\n,才能进行分析
awk内建变量:
在awk中,变量可以直接使用,不需要加上$符号
NF :每一行($0)拥有的字段总数
NR :目前awk所处理的是第几行数据
FS :目前的分隔字符,默认是空格键
last -n 5 |awk '{print $1 "\t" $3}' :获取帐号和登入者ip
last -n 5 |awk '{print $1 "\t lines: "NR"\t columes: "NF}' :获取帐号信息、列出目前处理行的行号,该行有多少字段
cat passwd |awk 'BEGIN {FS=":"} $3<10{print $1"\t" $3}' :查询第三栏小于10,并且列出帐号与第三栏。预设分隔符号为:号
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}' :格式化打印薪资数据,并且在最后一栏加上每个人的总额

档案对比工具 :diff
diff [-bBi] from-file to-file
from-file :一个档名,作为原始对比档案的档名
to-file :一个档名,作为目的对比档案的档名
注意 :from-file 或to-file可以-取代(-表示标准输出)
-b :忽略一行当中,仅有多个空白的差异
-B :忽略空白行的差异
-i :忽略大小写的不同
diff passwd.old passwd.new :对比两个档案的差异
diff /etc/rc3.d/ /etc/rc5.d/ :对比两个目录的差异

cmp :对比两个档案,主要利用字节单位去比对。可以用来对比binary文件
注 :diff主要按照行为单位对比,cmp则是以字节为单位去对比。
cmp [-s] file1 file2
-s :将所有的不同点的字节都列出来,cmp默认仅会输出第一个发现的不同点
cmp passwd.old passwd.new :对比两个档案

patch :应用patch
patch -pN < patch_file :更新
patch -R -pN < patch_file :还原
diff -Naur passwd.old passwd.new > passwd.patch :制作patch
patch -p0 < passwd.patch :将patch用来更新旧版数据
patch -R -p0 < passwd.patch :恢复旧档案内容

0 0
原创粉丝点击