一块儿学Shell之(三) 查找与替换

 

#----------------------------------------------------------#html

# ====>  红色字体 -特指煮酒我的所见。加粗则为须要重点注意。 #
# ====>  蓝色加粗 -特指与本文相关人员,包括参与修正的朋友。 #
# ====> 煮酒品茶 -Http://cwtea.blog.51cto.com          #
#----------------------------------------------------------#

 

 煮酒品茶:学习之中有乐趣固然也有苦闷,特别是刚看正则的时候一下就被转昏头了,不过还好,坚持下来了,正则看起来把复杂问题简单化,其实就能够解决问题了,sed也是,看了一天,笔记记了大概20来页,固然不可能全写上来。只能在笔记上找重点。下面开始吧。python

 
述:正则表达式能够提供更强大的标记法,以单个表达式匹配各类实际的文本数。
 
grep家族的武器强度。
----------------------------
grep:文本匹配程序
egrep:使用扩展正则表达式,消耗更多的运算资源
fgrep:快速grep,匹配固定字符串而非正则表达式。
-----------------------------
who |grep -F root
注:-F是grep默认的选项,列出单前root登录的信息,过程就是把who打印出来的信息交给grep,grep查找root的行。而后再打印出来。
grep 选项 文件
用途:显示一个或多个模式的文本行,一般用于管道|的第一步。具体参数请查找相关资料。
 
煮酒品茶:这个就不用多说了吧,用途大大的,各类查找,与sed awk cut组成强大的陈营。一块儿学下去确定会获得更多。下一步找个Shell分析一下。
 
正则表达式:是一种表达方式,让你能够查找匹配的特定准则的文本,例如表达以"a字母开头“匹配多个字符。
 
煮酒品茶:说白了,就是以特定的语言来规定内在的命令,就好像你在北京用家乡话和老乡沟通同样,别人听不懂的。听的懂的人就能够执行相关的命令了。可是搞IT的都喜欢弄些专业的名词来更好的表述本身的观点。
 
正则是由两个基本组成部分创建,通常字符和特殊字符,通常就是没有意义的字符,特殊就是有特别意义的字符就好像你的家乡话同样,又称 元字符
 
正则支持的命令有:
查找相关:grep egrep agrep 
编辑器:sed 
字符串处理程序:awk icon perl python ruby tcl 
文件查看程序:more page pg less 
文件编辑程序:vi emacs jed jove vile vim等
 
编写正则表达式的三个步骤:
一、知道要匹配的内容以及它如何出如今文本中。
二、编写一个模式来描述要匹配的内容。
三、测试模式来查看它的匹配内容
 
正则表达式产生的后果:
Hit命中 
Misses非命中
omissions遗漏
false alarms假命中
 
煮酒品茶:粗俗的来说就是你首先要须要你的需求以及怎么设计需求,最后预览一下看是否是和你的须要的同样。而产生的后果也就只有这么几种。能够根据错误往上查。
 
 
 
元字节查看图
 
------------------------------------------------
 

-------------------------------------------
 
煮酒品茶:看了表以后余下的就是多练习了,查看时必须先根据前优先级而后再查看,否则真的看晕你。大框架里包小框架,等下sed里会有,我多写一点实例。
 
优先级: 高至低
[....] [: :] 方括号符号
[ ]     方括号表达式
\( \) \digit  子表达式或反向应用
* \ & \ }    前置单个字符发现的正则表达式
无符号     连续
^$           锚点
 
煮酒品茶:你能够看不懂正则,但必定要记住优先级,否则你查表都无法查。
 
流编辑器Sed
    解释:shell中处理通常文件替换支持正则表达式与替换文本,任何可显示的字符均可以做为定界符,一般以标点符号做为分界符
 
如 sed 's/a/b/' file 做用是把file文件中的第一个a替换成b 那么上方的定界符解释是什么意思呢?
看这个你就明白了,sed's/a/b/' file 等同于 sed'#s#a#b' file 定界符就是这个意思,这里得感谢 dn833的指导,在sed中'与"均可以使用,意思就是说sed"s/a/b/' file也可使用。 
 
使用方法:
[address] command
替换:[address] s/pattern/replacement/flags
 
标记flages有:
-n 能够是1-512,表示第n次出现的替换状况
g  全局更改,就是所有替换的意思 sed 's/a/b/g' file 后面那个g也就是flages所有替换。
p  打印模式之间的内容
w file 写入到一个文件file中
 
 
 
 
 
下面有不少的实例:
 
------------------------------------------------
查看文件
[root@localhost sed]# cat file
a a a a a
b b b b bb
b
c c c c c 
c
ddd dd d d d 
d
 
替换第一个'无空格a'为b
[root@localhost sed]# sed 's/a/b/' file 
b a a a a
b b b b bb
b
c c c c c 
c
ddd dd d d d 
d
 
替换所有的a为b g表示所有替换
[root@localhost sed]# sed 's/a/b/g' file 
b b b b b
b b b b bb
b
c c c c c 
c
ddd dd d d d 
d
 
替换第一个'空格a'和'空格c',其中;是分隔符
[root@localhost sed]# sed 's/ a/, b/ ; s/ c/,d/' file
a, b a a a
b b b b bb
b
c,d c c c 
c
ddd dd d d d 
d
--------------------------------------------
 
替换' " [ ] \ / .等符号
替换'有点不一样
-------------------------------------------
[root@localhost sed]# sed 's/'\''/b/g' file
a a a a a
b b b b bb
b
c c c c c 
c
ddd dd d d d 
d
a a aa a
a
b " " " "
" ""
\\\\//[]
b bb bb b b
[root@localhost sed]# 
 
替换其它的[ ]< >等
[root@localhost sed]# sed 's/\[/b/g' file
a a a a a
b b b b bb
b
c c c c c 
c
ddd dd d d d 
d
a a aa a
a
' " " " "
" ""
\\\\//b]
' '' '' ' '
 
[root@localhost ~]# 
 
正则一例:
[root@localhost sed]# cat z
a:b
c:d
e:f
[root@localhost sed]# sed 's/\(.*\):\(.*\)/\2:\1/' z
b:a
d:c
f:e
 
煮酒品茶:如何来看这个正则呢? sed 's/\(.*\):\(.*\)/\2:\1/' z
首先看大框框sed's/?a/?b/' 能够分为两部分了,?a=\(.*\):\(.*\) ?b=\2:\1 这样是否是就能够看清了?解释?a,
\)就是相关的意思,正的变负的负的变正的,因此这里要这么理解\(,把通常字符(换成特殊字符,才能组成正则嘛,后面都同样,  .* 看表后会发现.是任意一个字符,*是任意多个前面的字符,.*就是任意多个字符,如今看?b \2:\1
前面说了\正的搞成反的,在sed里2和1都是通常字符,这里反过来就是特殊字符也就是第一段和第二段,第二段是?a的后面那个.* \1是前面那个.* 因此是否是正好反过来了。看正则先看大框架再看优先级。看的多了就知道看了。
 
册除空行和带#号的这一行,我本身写的,用sed -e也能够。
[root@localhost sed]# sed '/^$/D' /etc/vsftpd/vsftpd.conf |sed '/\#.*/D'
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
 
煮酒品茶:sed '/^$/D' /etc/vsftpd/vsftpd.conf |sed '/\#.*/D' 再拆呗,sed '//D是册除的写法,具体可看sed表。^$ ^是以这个为开头,$以这个为结尾,开头结尾那就是空行咯,因此空行全册掉。 后面那个\#.* #无论在sed里仍是正则里都没任何用,因此#.*也能够,咱们能够更好的写^#.*来实现。这个要配置文件中至关重要,别人要看你的配置文件,你给他成百上千的行给别人看?
 
sed -e方式
[root@localhost sed]# sed -e '/^$/D' -e '/\#.*/D' /etc/vsftpd/vsftpd.conf 
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
 
把单个数据替换成单个字母,这个可不是全局匹配哇。1和a 2b 3c等进行替换。
[root@localhost sed]# cat number
123456
123654
[root@localhost sed]# sed 'y/123456/abcdef/' number 
abcdef
abcfed
 
册除::d命令
sed '2d' file 册除file第二行 
sed '2,$d' file 册除2到最后那行
sed '$d'  file 册除最后一行
sed '/test/'d file 册除file中包含test的行。
sed '/a/b/'d file 册除a到b中间的行。
更多能够看:http://www.linuxde.net/2011/12/3381.html万变不离其宗,你掌握了规则,他再变也就是变下实例,其实吖根本就没变。
----------------------------------------------
 
 
CUT
解释:用来剪下文本文件中的数据,能够是字段类型和字符类型,一个制表字符为单个字符。
用法:cut -c list [file...]
      cut -f list [-d delim] [file...]
-c 以字符为主 
-d 定界符
-f 以字符为主
 
实例:
cut -d: -f 1,5 /etc/passwd   剪掉以:号为定界符的第1个和第5个而后打印出来,
/etc/passwd文件内容太多了,直接看这个吧。
---------------------------------------
[root@localhost sed]# echo 1:2:a:e:l:6|cut -d: -f 1,4
1:e
root@localhost sed]# 
------------------------------------------------------
 
JOin
解释:能够将多个文件结合在一块儿,每一个文件里的每条记录都共享一个健值,健值指的是主字段。
语法:join [options...] file1 file2
 
转换过程以下:
----------------------------
 
[root@localhost sed]# cat 1
a 1 
b 2
c 4
d 4
[root@localhost sed]# cat 2
a 2
b 4
c 8
d 9
 
[root@localhost sed]# join 1 2
a 1  2
b 2 4
c 4 8
d 4 9
[root@localhost sed]# 
----------------------------------
煮酒品茶:这个合并数据用不错。积累命令吧,积累多了你就是个宝库了。
 
 
Awk 
解释:读取命令上所指定的各个文件(若无,则标准输入),一次读取一条记录(行)再针对每一行应用程序所指定的命令。
...|awk '{print some-stuff}'|...
 
煮酒品茶:sed和awk是个大话题不可能一下讲过,因此原书上只讲了一部分,在后面有单独讲这个的。
 
awk '{print $1}' 打印第一个程序
awk '{print $1,$5}' 打印2-5个字段
awk '{print $1,$NFS}' 打印1到最后  这个打印出来没回车
awk 'NF>0 {print $0}' 打印1到最后 这个打印可来有回车
 
 
awk -F: '{print $1,$5}' 以:为定界符打印第一个字段和第五个字段。是否是和cut同样,咱们试下吧。
-----------------------------
[root@localhost sed]# echo "a:b:c:d:e:f" |awk -F: '{print $1,$4}'
a d
[root@localhost sed]# echo "a:b:c:d:e:f" |cut -d: -f 1,4
a:d
---------------------------------
煮酒品茶:基本没区别,可是中间有个:号,下面也会讲到的。
 
awk -F: -v'OFS=**' 'print $1,$4' file 这个是以**为来作分隔符啦,咱们再试下。
---------------------------
[root@localhost sed]# echo "a:b:c:d:e:f" |awk -F: -v 'OFS=:' '{print $1,$4}' 
a:d
[root@localhost sed]# 
--------------------------------------
煮酒品茶:注意OFS=:'后面要加个空格,和'{分开。
 
 
总结一下:笔记内容有, sed 正则 awk cut join 慢慢消化,多看实例,下回找个Shell来分析下。
相关文章
相关标签/搜索