笔记之sed工具
基础正则表达式特殊字符归纳表:
RE字符 | 意义 |
^word | 意义:待查找的字符串(word)在行首。 |
word$ | 意义:带查找的字符串(word)在行尾。 |
. | 意义:代表一定有一个任意字符的字符。 |
\ | 意义:转义字符,将特殊符号的特殊意义去除。 |
* | 意义:重复零个到无穷多个的前一个字符。 |
[list] | 意义:从字符集合的RE字符里面找出想要选取的字符。 grep -n 'g[ol]d' test.txt#查找出god,gld字符。 |
[n1-n2] | 意义:从字符集合的RE字符里面找出想要选取的字符范围。 grep -n '[0-9]' test.txt grep -n '[a-z]' test.txt grep-n '[A-Z]' test.txt |
[^list] | 意义:从字符集合的RE字符里面找出不要的字符串或范围。 ^在[]内时,代表的意义是“反向选择”的意思。不要大写[^A-Z] [^a-z] [^0-9] 表示反向的提取。不过,如果每行里有大写和小写字符,如果使用grep -n '[^A-Z]' test.txt 那么,含有小写字符的行,就会被列出来。 |
\{n,m\} | 意义:连续n到m个的前一个RE字符,若为\{n\}则是连续n个的前一个RE字符,若为\{n,\}则是连续n个以上的前一个RE字符 范例:在g与g之间有2个到3个的o存在的字符串,即(goog)(gooog)grep -n 'go\{2,3\}g' test.txt |
sed工具
sed[-nefr] 动作
参数:
-n:使用安静模式,一般sed的用法中,所有数据都会被列出到屏幕上,使用-n那就只用被处理过的那行,才会列举到屏幕上。
-e:直接在命令行模式上进行sed的动作编辑。
-f:直接将sed的动作卸载一个文件内,-ffilename则可以执行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:打印,也就是将某个选择的数据打印出来,通常p会与参数sed -n一起运行的。
s:替换,可以直接进行替换的工作,通常这个s的动作可以搭配正则表达式!例如1,20s/old/new/g。
[root@mysql data]# nl test2.txt #这是完整的test2文本文件,以下的例子我们都由它来举例。
1woshi 111
2tashi 234
3woshi 456
4tashi 678
5kajdklfjalskd
6sdlkjflka
7lksdjflkasd
※以行为单位的新增,删除功能
[root@mysql data]# nl test2.txt |sed '5,7d'#删除5到7行。
1woshi 111
2tashi 234
3woshi 456
4tashi 678
[root@mysql data]# nl test2.txt |sed '5,$d'#删除5到最后一行。
1woshi 111
2tashi 234
3woshi 456
4tashi 678
[root@mysql data]# sed -e '4a hahah'test2.txt |nl #新增一行字符数据。(在第4行下)
1woshi 111
2tashi 234
3woshi 456
4tashi 678
5hahah
6kajdklfjalskd
7sdlkjflka
8lksdjflkasd
[root@mysql data]# sed -e '4i hahah'test2.txt |nl #新增一行字符数据。(在第4行上)
1woshi 111
2tashi 234
3woshi 456
4hahah
5tashi 678
6kajdklfjalskd
7sdlkjflka
8lksdjflkasd
※以行为单位的替换,显示功能
[root@mysql data]# sed '3,5c dajiadoushi'test2.txt |nl#该为替换3到5行为后面的字符数据。
1woshi 111
2tashi 234
3dajiadoushi
4sdlkjflka
5lksdjflkasd
[root@mysql data]# sed '5,7p' test2.txt #加上-n与不加的效果,显而易见。
woshi 111
tashi 234
woshi 456
tashi 678
kajdklfjalskd
kajdklfjalskd
sdlkjflka
sdlkjflka
lksdjflkasd
lksdjflkasd
[root@mysql data]# sed -n '5,7p' test2.txt #这是加-n的显示。
kajdklfjalskd
sdlkjflka
lksdjflkasd
※数据查找并替换的功能
sed's/需要被替换的字符串/新字符串/g'或者 sed 's###g'
提示:如果s///g后面的g去掉的话,表示替换每行的第一个匹配的字符串。
如果不去掉g,那么表示替换说有匹配的字符串。
同时,如果///内出现变量等内容,注意需要使用双引号。
范:1:截取本地计算机eth0的IP地址。
[root@mysql data]# ifconfig eth0
eth0Link encap:EthernetHWaddr00:0C:29:14:88:2A
inet addr:192.168.126.128Bcast:192.168.126.255Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe14:882a/64 Scope:Link
UP BROADCAST RUNNING MULTICASTMTU:1500Metric:1
RX packets:19521 errors:0 dropped:0 overruns:0 frame:0
TX packets:17277 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:3893186 (3.7 MiB)TXbytes:1690940 (1.6 MiB)
Interrupt:67 Base address:0x2000
[root@mysql data]# ifconfig eth0|grep 'inetaddr:'|sed 's/^.*addr://g'|sed 's/Bcast.*$//g'
192.168.126.128
范例2:更改test2.txt文件中tashi替换为no;
[root@mysql data]# cat test2.txt
woshi 111
tashi 234
woshi 456
tashi 678
kajdklfjalskd
sdlkjflka
lksdjflkasd
[root@mysql data]# sed 's/tashi/no/g'test2.txt #具体命令操作方法。提示:如果想更改,需要加参数-n。
woshi 111
no 234
woshi 456
no 678
kajdklfjalskd
sdlkjflka
lksdjflkasd
范例3:替换文本中第一行第一个匹配的字符串。
[root@mysql ~]# cat test2.txt
woshi 111
tashi 234
woshi 456
tashi 678
[root@mysql ~]# sed '0,/woshi/ s/\(woshi \).*/\1999/'test2.txt
#剖析:
0,/woshi/:数字0表示从0-1取两个匹配“/字符串/”的行,该参数需要结合s///g使用。使用位置最前方,表示提取并保留的行。
\(woshi\).*:匹配原有字符串,其中小括号需要转义,因为有空格符。“.*”表示有一个或多个字符。
\1999:其中“\1”代表替换,“\0”代表在原有字符串后累加。
woshi 999
tashi 234
woshi 456
tashi 678
其他范例:对文本中的数据进行技术统计。
[root@mysql data]# cat test3.txt
woshi 111
woshi 111
woshi 111
tashi 234
woshi 456
woshi 456
tashi 678
tashi 678
tashi 678
kajdklfjalskd
sdlkjflka
lksdjflkasd
[root@mysql data]# grep'[0-9]' test3.txt|sort -n |uniq -c
1 tashi 234
3 tashi 678
3 woshi 111
2 woshi 456
此博文仅为学习笔记只用,还有很多不足,请大家指出。