Sed:一些常用的命令详解

Sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作,下面先了解一下Sed的用法。

用法

Sed命令行格式

sed -$Options "$Features" $File

$Options

-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e :直接在命令列模式上进行 sed 的动作编辑;
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
-i :直接修改读取的文件内容,而不是输出到终端。

指定行数

不一定要存在指定的行数,一般代表选择进行动作的行数,举例来说,如果我的动作是需要在10到20行之间进行的,则完整代码是sed -$Options "10,20$Features" $File

$Features

a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字串,这些字串可以取代你指定行的所有内容!
d :删除, 因为是删除啊,所以 d 后面通常不接任何东西;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :列印, 亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
r :引入, sed中的 r 命令会把其后面的任何字符判读为文件名,直到回车符或是单引号;
s :取代, 可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 sed “s/要被取代的字串/新的字串/g”就是啦!

$File

你要进行动作的文件名例如98k.txt

实例

假设我们有一文件名为98k.txt,内容如下

this is a newfile!
hello world
please
asd12
123asdasd

删除某行

对98k.txt的行进行操作,将操作结果输出到终端(只是做模拟操作,不改动源文件)

sed "1d" 98k.txt         # 输出删除第一行后的文件内容
sed "$d" 98k.txt         # 输出删除最后一行后的文件内容
sed "1,2d" 98k.txt       # 输出删除第一行到第二行后的文件内容
sed "2,$d" 98k.txt       # 输出删除第2行到最后1行后的文件内容

显示某行

sed -n "1p" 98k.txt           # 只显示文件的第一行 
sed -n "$p" 98k.txt           # 只显示文件的最后一行
sed -n "1,2p" 98k.txt         # 只显示文件的第一行到第二行
sed -n "2,$p" 98k.txt         # 显示文件的第二行到最后一行

使用安静模式进行查询

sed -n "/ruby/p" 98k.txt
输出关键字ruby所在行的内容;其中"/str/p",str为搜索的文本内容
sed -n "/$/p" 98k.txt
输出关键字$所在行的内容,使用反斜线屏蔽特殊含义

增加一行或多行字符串

sed "1a drink tea" 98k.txt            # 在第一行后增加字符串"drink tea"
sed "1,3a drink tea" 98k.txt          # 在第一行到第三行后增加字符串"drink tea"
sed "1a drink teanor coffee" 98k.txt # 在第一行后增加两行,换行使用n,可多次使用n添加多行

增加另外一个文件的内容

sed "1r 1.txt" 98k.txt     # 把1.txt的内容增加到98k.txt的第一行后

替代一行或多行

sed "1c Hi" 98k.txt    # 把98k.txt的第一行替换为Hi
sed "1,2c Hi" 98k.txt  # 把98k.txt的第一行到第二行替换为Hi

替换一行中的某部分字符串

格式:sed "s/要替换的字符串/新的字符串/g" 98k.txt (要替换的字符串可以用正则表达式)

sed "s/ruby/bird/g" 98k.txt   # 把全部的ruby替换为bird
sed "s/ruby//g" 98k.txt       # 把全部的ruby替换为空,即删除ruby字符串

sed -i 命令详解

sed -i是直接对文件进行操作

# 对每行匹配到的第一个字符串进行替换
sed -i "s/原字符串/新字符串/" 98k.txt

# 对全局匹配上的所有字符串进行替换
sed -i "s/原字符串/新字符串/g" 98k.txt

# 删除所有匹配到字符串的行
sed -i "/匹配字符串/d"  98k.txt

# 特定字符串的行后插入新行
sed -i "/特定字符串/a 新行字符串" 98k.txt

# 特定字符串的行前插入新行
sed -i "/特定字符串/i 新行字符串" 98k.txt

# 把匹配行中的某个字符串替换为目标字符串
sed -i "/匹配字符串/s/源字符串/目标字符串/g" 98k.txt

# 在文件98k.txt中的末行之后,添加bye
sed -i "$a bye" 98k.txt

# 对于文件第3行,把匹配上的所有字符串进行替换
sed -i "3s/原字符串/新字符串/g" 98k.txt

sed命令详解

sed是Linux中处理文本最重要的两个工具之一,能够极大简化需要进行的数据处理任务。

sed被称为流编辑器(stream editor),可以根据命令来处理数据流中的数据。这些命令要么从命令行中输入,要么存储在一个命令文本文件中。sed会执行一下操作:

(1)一次从输入中读取一行数据

(2)根据所提供的编辑器命令匹配数据

(3)按照命令修改流中的数据

(4)将新的数据输出到STDOUT

在流编辑器将所有命令与一行数据匹配完毕后,它会读取下一行数据并重复这个过程。在流编辑器处理完流中所有的数据行之后,它就会终止。

sed命令的格式为:

sed options script file

options中常用的选项如下所示:

  • -e command   将command中的命令添加到已有的命令中,也就是说当sed中使用多个命令时要使用这个选项。
  • -f file  将file中制定的命令添加到已有的命令中,注意每一个命令都要在独立的一行里。
  • -i  直接修改源文件。
  • -n 通常情况下,当所有命令执行完后输出会显示在STDOUT中,-n选项会禁止输出。通常和替换标记p一起使用,只输出被修改过的行。

script中的常用使用方式:

1、替换文本中的指定字符,形式为:

sed 's/pattern/replacement/flags'

主要用法有(注意:如果不加上-i选项,修改的都是流中的内容,file本身的内容没有变化):

sed 's/pattern/replacement/' file   将file的流中每行的第一个pattern替换成replacement
sed 's/pattern/replacement/g' file    将file的流中每行的每一个pattern替换成replacement
sed 's/pattern/replacement/2' file    将file的流中每行的第二个pattern替换成replacement
sed -n 's/pattern/replacement/p' file   将file的流中每行的第一个pattern替换成replacement,并打印出修改过的行
sed -n 's/pattern/replacement/2p' file   将file的流中每行的第二个pattern替换成replacement,并打印出修改过的行(标记符号可以多个一起使用,且顺序不影响结果)
sed 's/pattern/replacement/gw outFile' file   将file的流中每行的每一个pattern替换成replacement,并将输出保存到outFile中(w标记必须要放在最后,如果写作wg,标记g将无效,并生成名为g outFile的输出文件)
sed '2s/pattern/replacement/' file   将file的流中第二行的第一个pattern替换成replacement
sed '2,4s/pattern/replacement/' file   将file的流中第二行到第四行的第一个pattern替换成replacement
sed '2,$s/pattern/replacement/' file   将file的流中第二行到最后一行的第一个pattern替换成replacement
sed '/word/s/pattern/replacement/' file   将file的流中含有word的行中的第一个pattern替换成replacement,可以使用正则表达式

2、删除文本

sed 'd' file   将file的流中所有行全部删除
sed '2d' file   将file的流中的第二行删除
sed '2,4d' file   将file的流中的第二行到第四行删除
sed '2,$d' file   将file的流中的第二行到最后一行删除
sed '/word/d' file   将file的流中含有word的行删除

3、插入和附加文本

(1)插入(insert)命令(i)会在指定行前增加一个新行。

(2)附加(append)命令(a)会在指定行后增加一个新行。

格式为:

sed '[address]commandnew line'

主要用法为($和匹配模式/word/都可以使用):

sed '3iThis a an inserted line.' file   将一个新行插入到file的流的第三行前
sed '3aThis a an inserted line.' file   将一个新行插入到file的流的第三行后

4、修改行($和匹配模式/word/都可以使用):

sed '3cThis is a changed line.' file   将file的流的第三行修改为This is a changed line.

5、转换命令

转换(transform)命令(y)是唯一可以处理单个字符的sed命令,格式如下:

sed '[address]y/inchars/outchars'

转换命令会对inchars和outchars做一对一映射,inchars的第一个字符会被转换为outchars的第一个字符,inchars的第二个字符会被转换为outchars的第二个字符。如果inchars和outchars的长度不同,sed编辑器会产生一条错误消息:

sed: 1: "y/abc/de/": transform strings are not the same length

举例如下:

$ echo "1 2 3 1 2 3 2 3 4 5 6" | sed 'y/123/456/'

4 5 6 4 5 6 5 6 4 5 6

可以看出,转换命令是一个全局命令,会在文本行中找到的所有指定字符进行转换,无法限定只转换在特定地方出现的字符。

6、写入文件

sed 'w outFile' file   将file的内容写入到outFile中
sed '1,2w outFile' file   将file第一行到第二行的内容写入到outFile中

7、从文件读取数据($和匹配模式/word/都可以使用):

sed '3r newFile' file   将newFile的内容添加到file的流的第三行之后

Linux命令之grep/sed/awk等行转列

行转列

样例文件如下

cat file.txt
a b c
d e f
g h i

1、cat file.txt |xargs -n1

2、xargs -n 1 < file.txt

3、tr " " "n" < file.txt

4、sed 's/ /n/g' file.txt
此命令在Linux上执行正常,在Mac上执行无效,原因是因为Mac上的sed是BSD版本,Linux上的是Gnu版本,在Mac上需要使用sed -e ‘s/ /’$’n/g’ file.txt

5、sed 's/ /n/g' file.txt 同上

6、awk '{for(i=1;i<=NF;i++)print $i}' file.txt

7、awk -vOFS="n" '$1=$1' file.txt Linux上正常,Mac上无效

8、awk '{OFS=RS}NF=NF' file.txt Linux上正常,Mac上无效

列转行

样例文件如下

cat file.txt
a
b
c
d
e
f

1、cat file.txt | tr "n" ","

Linux三大利器grep、sed、awk

一. grep和正则表达式

grep

grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

选项

-d<进行动作> 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作。

-i 忽略字符大小写的差别。

-l 列出文件内容符合指定的范本样式的文件名称。

-n 在显示符合范本样式的那一列之前,标示出该列的编号。

-R/-r 此参数的效果和指定“-d recurse”参数相同。

-v 反转查找。

1、-r递归查找

root@siguorui-OptiPlex-7010:/home/xhprof/trunk# grep -r XHProfRuns_Default *
examples/sample.php:$xhprof_runs = new XHProfRuns_Default();
xhprof_html/callgraph.php:$xhprof_runs_impl = new XHProfRuns_Default();
xhprof_html/typeahead.php:$xhprof_runs_impl = new XHProfRuns_Default();

2、-I的使用,显示文件名称

root@siguorui-OptiPlex-7010:~# grep -I root abc.txt 123.txt passwd 
passwd:root:x:0:0:root:/root:/bin/bash

3、-n

root@siguorui-OptiPlex-7010:~# grep -n 'root' passwd 
1:root:x:0:0:root:/root:/bin/bash

正则表达式

1、正则表达式单字符

  • 特定字符
    • grep ‘a’ passwd
  • 范围内字符
    • grep ‘[a-z]’ passwd
    • grep ‘[A-Za-z0-9]’ passwd
    • grep ‘[^0-9]’ passwd 取反,除去数字之外的字符
  • 任意字符
    • grep ‘.’ passwd

但是在grep ‘[.]’中,.只是代表点这样的字符,注意区别。如果要使用.的本意,采用.的方式

  • 以上三种组合

2、正则表达式其他符号

  • 边界字符 头尾字符
    • ^字符,头字符,放在一串字母前边,代表以此开头。grep ‘^root’ passwd
    • $符号,如false$,代表以false字符结束
    • ^$ 代表空行,grep ‘^$’ passwd
  • 元字符
    • w:匹配任何字类字符,包括下划线。相当于([A-Za-z0-9_])
    • W:大写的W,匹配任何非字类字符。相当于([^A-Za-z0-9_])
    • b 代表单词分隔。如,grep ‘bxb’ passwd,可以将单个前后分隔的x字符选出来,但不会选择单词中出现的x
  • 正则表达式字符组合
    • 重复
* : 零次或多次匹配前面的字符或子表达式。例子:grep 'se*' test.txt
+ : 一次或多次匹配前面的字符或表达式.例子:grep 'se+' test.txt.注意这里加号前面要加反斜杠
? : 零次或一次匹配前面的字符或表达式.如:grep 'se?' test.txt.注意?前面也要加反斜杠
括号的使用 :grep '(se)*' test.txt。注意括号前面要加反斜杠
指定重复次数 : grep '[0-9]{2,3}' passwd 

二.sed 行编辑器

sed是一种流编辑器,它是文本处理中非常重要的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

命令格式

sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)

options常用选项

-e<script>或--expression=<script>:以选项中的指定的script来处理输入的文本文件;

-n或--quiet或——silent:仅显示script处理后的结果;

command常用

a 在当前行下面插入文本。
i 在当前行上面插入文本。
c 把选定的行改为新的文本。
d 删除,删除选择的行。
n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
s 替换指定字符
p 打印模板块的行。
q 退出Sed。
r file 从file中读行。
w file 写并追加模板块到file末尾。  

1、p 打印相关的行

nl passwd|sed -n '10p' //打印第10行内容
sed -n 'p' passwd
sed -n '/root/p' passwd //正则匹配打印
nl passwd|sed -n '10,20p' //打印第10行到20行
nl passwd|sed -n '/news/,/nobody/p' //用正则来指定一个行的范围
nl passwd|sed -n '10,20!p'  //不选择10到20行,!代表取反
nl passwd|sed -n '1~2p' //间隔行,会输出1,3,5....行

注意,这里一定要加上-n选项,否则每条数据会显示同样的2行。并且无关的其他内容也会显示出来

2、a 在行后面增加内容

root@siguorui-OptiPlex-7010:~# nl passwd|sed '2a **************'
     1    root:x:0:0:root:/root:/bin/bash
     2    daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
**************
     3    bin:x:2:2:bin:/bin:/usr/sbin/nologin

nl passwd|sed '1,2a **************' //在范围内的每一行后面都插入

3、i在行前面插入

root@siguorui-OptiPlex-7010:~# nl passwd|sed '1,2i **************'
**************
     1    root:x:0:0:root:/root:/bin/bash
**************
     2    daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin

4、c把选定的行改为新的文本

root@siguorui-OptiPlex-7010:~# nl passwd|sed '1c abcd'
abcd
     2    daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin

 //与a,i不同的时,如果这里是一个行的范围则是把这个范围内容替换为当前内容   
root@siguorui-OptiPlex-7010:~# nl passwd|sed '1,3c abcd'
abcd
     4    sys:x:3:3:sys:/dev:/usr/sbin/nologin

5、d删除行

root@siguorui-OptiPlex-7010:~# nl passwd | sed '/root/d'
     2    daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
     3    bin:x:2:2:bin:/bin:/usr/sbin/nologin

应用案例

在文件的末尾插入2行
nl passwd | sed '$a     abcd n    linux'

    49    memcache:x:126:132:Memcached,,,:/nonexistent:/bin/false
    50    postfix:x:127:133::/var/spool/postfix:/bin/false
    51    mongodb:x:128:65534::/var/lib/mongodb:/bin/false
    abcd 
    linux


    删除文件中的空行,^$直接相连代表空行
    nl passwd | sed '/^$/d'

6、s替换命令

sed 's/false/true/' passwd 
输出:
...
sphinxsearch:x:124:131::/home/sphinxsearch:/bin/true
sshd:x:125:65534::/var/run/sshd:/usr/sbin/nologin
memcache:x:126:132:Memcached,,,:/nonexistent:/bin/true
postfix:x:127:133::/var/spool/postfix:/bin/true

sed 's/:/%/g' passwd  //加g全局替换
输出:
sphinxsearch%x%124%131%%/home/sphinxsearch%/bin/false
sshd%x%125%65534%%/var/run/sshd%/usr/sbin/nologin
memcache%x%126%132%Memcached,,,%/nonexistent%/bin/false
postfix%x%127%133%%/var/spool/postfix%/bin/false

过滤ifconfig中的ip

eno1      Link encap:以太网  硬件地址 f8:b1:56:c5:e7:44  
          inet 地址:172.19.5.175  广播:172.19.5.255  掩码:255.255.255.0
          inet6 地址: fe80::c422:e82d:ad66:7a92/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  跃点数:1
          接收数据包:35171885 错误:53864 丢弃:0 过载:0 帧数:29047
          发送数据包:25049325 错误:0 丢弃:0 过载:0 载波:0
          碰撞:0 发送队列长度:1000 
          接收字节:8124495140 (8.1 GB)  发送字节:4549284803 (4.5 GB)
          中断:20 Memory:f7f00000-f7f20000 

 ifconfig eno1 | sed -n '/inet /p'|sed 's/inet.*地址://'|sed 's/广播.*$//'

 输出:
 172.19.5.175

高级操作命令

1、多个sed命令,用{}包住,‘;’隔开

删除44-48行内容,然后将false替换为true
nl passwd|sed '{44,48d;s/false/true/}'

    41    statd:x:121:65534::/var/lib/nfs:/bin/true
    42    mysql:x:1001:1001::/home/mysql:/sbin/nologin
    43    www:x:1002:1002::/home/www:/sbin/nologin
    49    memcache:x:126:132:Memcached,,,:/nonexistent:/bin/true
    50    postfix:x:127:133::/var/spool/postfix:/bin/true
    51    mongodb:x:128:65534::/var/lib/mongodb:/bin/true

2、n 读取下一个输入行

//n的用法
root@siguorui-OptiPlex-7010:~# nl passwd|sed -n '{p;n}'
     1    root:x:0:0:root:/root:/bin/bash
     3    bin:x:2:2:bin:/bin:/usr/sbin/nologin
     5    sync:x:4:65534:sync:/bin:/bin/sync
     7    man:x:6:12:man:/var/cache/man:/usr/sbin/nologin

提示: nl passwd|sed -n '{1~2p}'  前面讲到的,~也可以实现同样的效果

3、&替换固定字符串,&代表前面匹配到的字符

//姓名和后面的内容加空格隔开
root@siguorui-OptiPlex-7010:~# sed 's/^[a-z_]+/&     /' passwd
root     :x:0:0:root:/root:/bin/bash
daemon     :x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin     :x:2:2:bin:/bin:/usr/sbin/nologin


//用户名的首字母转换为大写
//元字符u l(对首字母大小写转换) U L(对一串字符大小写转换),转换为大写小写字符

//小写u,替换用户名首字母
root@siguorui-OptiPlex-7010:~# sed 's/^[a-z_]+/u&/' passwd
Root:x:0:0:root:/root:/bin/bash
Daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
Bin:x:2:2:bin:/bin:/usr/sbin/nologin

//大写U,用户名全部替换为大写
root@siguorui-OptiPlex-7010:~# sed 's/^[a-z_]+/U&/' passwd
ROOT:x:0:0:root:/root:/bin/bash
DAEMON:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
BIN:x:2:2:bin:/bin:/usr/sbin/nologin

4、()的使用

//从passwd文件中,提取出username,uid,gid.  1,2,3代表前面()匹配到字符
root@siguorui-OptiPlex-7010:~# sed 's/(^[a-z_-]+):x:([0-9]+):([0-9]+):.*$/USER:1    UID:2   GID:3/' passwd
USER:root    UID:0   GID:0
USER:daemon    UID:1   GID:1
USER:bin    UID:2   GID:2
USER:sys    UID:3   GID:3
USER:sync    UID:4   GID:65534

5、-r复制指定文件插入到匹配行。-w复制匹配行拷贝到指定文件

//123.txt文件中有3行,全是数字。abc.txt文件中有3行,全是字母
//下面命令的实现结果,读取123.txt的内容,复制到匹配的abc.txt文件的第一行,文件内容均不改变
root@siguorui-OptiPlex-7010:~# sed '1r 123.txt' abc.txt 
qwefadssa
1232323223
32343434
23333
trwrda
asdfasdf

//下面命令的实现结果,匹配abc.txt文件的第二行,写入到123.txt文件中。123.txt文件会发生变化,abc.txt文件内容不变
root@siguorui-OptiPlex-7010:~# sed '2w 123.txt' abc.txt 
qwefadssa
trwrda
asdfasdf
root@siguorui-OptiPlex-7010:~# cat 123.txt 
trwrda


//总结
sed '2w或2r 文件A' 文件B
匹配的文件都是针对文件B来说的,读或写都是针对文件A来说的

6、q找到指定结果后就提前退出

root@siguorui-OptiPlex-7010:~# nl passwd |sed '2q'
     1    root:x:0:0:root:/root:/bin/bash
     2    daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
root@siguorui-OptiPlex-7010:~# nl passwd |sed '/root/q'
     1    root:x:0:0:root:/root:/bin/bash
root@siguorui-OptiPlex-7010:~# 

三、awk

AWK是一种处理文本文件的语言,是一个强大的文本分析工具。特点是处理灵活,功能强大。可实现统计、制表以及其他功能。

之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的Family Name的首字符。

格式

命令行格式
awk [options] 'command' file(s)

脚本格式
awk -f awk-script-file file(s)

命令形式:

awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file
  • [-F|-f|-v] 大参数,-F指定分隔符,-f调用脚本,-v定义变量 var=value

' ' 引用代码块

  • BEGIN 初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符
  • // 匹配代码块,可以是字符串或正则表达式
  • {} 命令代码块,包含一条或多条命令
  • ; 多条命令使用分号分隔
  • END 结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息

常用内置参数

  • $0,$1,$2… 表示整个当前行
  • $1 每行第一个字段
  • NF 字段数量变量
  • NR 每行的记录号,多文件记录递增
  • FILENAME 文件名

1、常用内置参数,$1,$2….。通过分隔符指定,按顺序依次为$1,$2…。默认分隔符为空格

awk -F ':' '{print "USERNAE:"$1"t""UID:"$3}' passwd

2、NR,NF,FILENAME

awk -F ':' '{print "Line:"NR,"Col:"NF,"USER:"$1}' passwd

3、运用printf指定格式来打印

awk -F ':' '{printf("Line:%3s Col:%s User:%sn",NR,NF,$1)}' passwd

root@siguorui-OptiPlex-7010:~# awk -F ':' '{printf("Line:%3s Col:%s User:%sn",NR,NF,$1)}' passwd
Line:  1 Col:7 User:root
Line:  2 Col:7 User:daemon
Line:  3 Col:7 User:bin
Line:  4 Col:7 User:sys
...

4、使用if

awk -F ':' '{if ($3>100) printf("Line:%3s Col:%s User:%sn",NR,NF,$1)}' passwd

5、正则和命令结合使用

awk -F ':' '/root/{print $1}' passwd

root@siguorui-OptiPlex-7010:~# awk -F ':' '/root/{print $1}' passwd
root

6、使用BEGIN和END来制表

awk -F ':' 'BEGIN{print "line col user"}{print NR" |"NF" |"$1}END{print "----------------"FILENAME}' passwd

7、使用BEGIN和END来统计一个目录下文件总计大小

ls -l|awk 'BEGIN{size=0}{size+=$5}END{print " size is "size/1024/1024"M"}'

8、统计passwd中不为空的行数。$1!~,~代表匹配后面的正则,!~代表不匹配。/^$/正则匹配空行

awk -F ':' 'BEGIN{count=0}$1!~/^$/{count++}END{print " count ="count}' passwd

9、统计结果放到数组中,并打印输出

awk -F ':' 'BEGIN{count=0}{if ($3>100) name[count++]=$1}END{for(i=0;i<count;i++) print i,name[i]}' passwd 

root@siguorui-OptiPlex-7010:~# awk -F ':' 'BEGIN{count=0}{if ($3>100) name[count++]=$1}END{for(i=0;i<count;i++) print i,name[i]}' passwd 
0 nobody
1 systemd-network
2 systemd-resolve
3 systemd-bus-proxy
4 syslog

Shell中使用grep、sed正则提取、替换字符串

Linux中使用grep正则提取字符串

echo office365 | grep -P 'd+' -o
find . -name "*.txt" | xargs grep -P 'regex' -o

xargs会将find结果作为grep的输入,防止find结果过多无法处理
-P参数表明要应用正则表达式
-o表示只输出匹配的字符串,这样我们就可以把正则匹配到的结果拿到了。

Linux、Mac OS中使用sed正则提取字符串

Mac OS上用正则的话要用e参数取代P参数,也可以用sed命令:
sed命令格式:

sed 's/oldValue/newValue/g'

提取字符串

echo here365test | sed 's/.*ere([0-9]*).*/1/g'

输出:

365

s表示替换,1表示用第一个括号里面的内容替换整个字符串,sed支持*,不支持?、+,不能用d之类,正则支持有限。

替换字符串

echo here365test | sed 's/365/789/g'

输出:

here789test

Linux命令之sed批量替换字符串操作

使用sed命令可以进行字符串的批量替换操作,以节省大量的时间及人力;

使用的格式如下:

sed -i "s/oldstring/newstring/g" `grep oldstring -rl path`

其中,oldstring是待被替换的字符串,newstring是待替换oldstring的新字符串,grep操作主要是按照所给的路径查找oldstring,path是所替换文件的路径;

-i 选项是直接在文件中替换,不在终端输出;

-r 选项是所给的path中的目录递归查找;

-l 选项是输出所有匹配到oldstring的文件;

实例:

1、替换指定文件的字符串

sed -i "s/oldstring/newstring/g" filename

sed -i "s/6/sk/g" ./test01.txt

2、字符串替换批量文件操作

sed -i "s/6/sk/g" ·grep 6 -rl /home/work/test`

sed -i "s/6/sk/g" ·grep 6 -rl /home/work/test/*.sh`

可将test目录下的所有相关文件都进行字符串替换

参考:

http://blog.163.com/daniel_ao/blog/static/1100988432010722642551/

http://www.jb51.net/LINUXjishu/155122.html

sed -i "" "s/搜索的字符串/替换的字符串/g" grep搜索的字符串 -rl 所在目录

由于mac需要标准输入 所以 -i 后面加上""

sed 字符串替换

1. sed替换的基本语法为:

sed 's/原字符串/替换字符串/'

单引号里面,s表示替换,三根斜线中间是替换的样式,特殊字符需要使用反斜线””进行转义。

2. 单引号” ‘ ’”是没有办法用反斜线””转义的,这时候只要把命令中的单引号改为双引号就行了,格式如下:

# 要处理的字符包含单引号
sed "s/原字符串包含'/替换字符串包含'/" 

3. 命令中的三根斜线分隔符可以换成别的符号,有时候替换目录字符串的时候有较多斜线,这个时候换成其它的分割符是较为方便,只需要紧跟s定义即可。

# 将分隔符换成问号”?”:
sed 's?原字符串?替换字符串?'

4. 可以在末尾加g替换每一个匹配的关键字,否则只替换每行的第一个,例如:

# 替换所有匹配关键字
sed 's/原字符串/替换字符串/g'

5. 一些特殊字符的使用

”^”表示行首

”$”符号如果在引号中表示行尾,但是在引号外却表示末行(最后一行)
  

# 注意这里的 " & " 符号,如果没有 “&”,就会直接将匹配到的字符串替换掉
sed 's/^/添加的头部&/g'      #在所有行首添加
sed 's/$/&添加的尾部/g'      #在所有行末添加
sed '2s/原字符串/替换字符串/g'  #替换第2行
sed '$s/原字符串/替换字符串/g'   #替换最后一行
sed '2,5s/原字符串/替换字符串/g' #替换2到5行
sed '2,$s/原字符串/替换字符串/g' #替换2到最后一行

6. 批量替换字符串

sed -i "s/查找字段/替换字段/g" `grep 查找字段 -rl 路径`
sed -i "s/oldstring/newstring/g" `grep oldstring -rl yourdir

7. sed处理过的输出是直接输出到屏幕上的,使用参数”i”直接在文件中替换。

# 替换文件中的所有匹配项
sed -i 's/原字符串/替换字符串/g' filename

8. 多个替换可以在同一条命令中执行,用分号”;”分隔,其格式为:

# 同时执行两个替换规则
sed 's/^/添加的头部&/g;s/$/&添加的尾部/g' 

正则表达式sed

sed 能实现grep查找的功能,还可以替换指定的字符。

匹配查找文件中root字符(其中的 -n表示段落,p表示打印出来print)

[root@localhost sed]# sed -n '/root/'p test.txt 

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

. 点 (匹配任意一个字符)

[root@localhost sed]# sed  -n '/r.t/'p test.txt 

operator:x:11:0:operator:/root:/sbin/nologin

sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

* (匹配一个或多个字符)

[root@localhost sed]# sed -n '/r*t/'p test.txt 

root:x:0:0:root:/root:/bin/bash

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

halt:x:7:0:halt:/sbin:/sbin/halt

operator:x:11:0:operator:/root:/sbin/nologin

ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin

dbus:x:81:81:System message bus:/:/sbin/nologin

polkitd:x:999:997:User for polkitd:/:/sbin/nologin

postfix:x:89:89::/var/spool/postfix:/sbin/n1ogin

sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

+ 加号表示一个或者多个字符

[root@localhost sed]# sed -n '/r+t/'p test.txt 

不脱义,需要加一个-r

[root@localhost sed]# sed -nr '/r+t/'p test.txt 
[root@localhost sed]# sed -nr '/o+t/'p test.txt 

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

显示第2行内容

[root@localhost sed]# sed -n '2'p test.txt 

bin:x:1:1:bin:/bin:/sbin/NOLOGIN

显示2到5行

[root@localhost sed]# sed  -n '2,5'p test.txt 

bin:x:1:1:bin:/bin:/sbin/NOLOGIN

daemon:x:2:2:daemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

显示5到后面的行 5,;;表示后面的行

[root@localhost sed]# sed -n '5,$'p test.txt 

显示全部内容 1,$

[root@localhost sed]# sed -n '1,$'p test.txt 

显示第一行 和 匹配bus字符 用-e 可以执行多步操作 -n是显示段落 p是print打印输出

[root@localhost sed]# sed -e '1'p -e '/bus/'p  -n test.txt 

root:x:0:0:root:/root:/bin/bash

dbus:x:81:81:System message bus:/:/sbin/nologin

显示第一段,匹配root字符,匹配oo字符

[root@localhost sed]# sed -e '1'p  -e '/root/'p -e '/oo/'p -n test.txt 

root:x:0:0:root:/root:/bin/bash

root:x:0:0:root:/root:/bin/bash

root:x:0:0:root:/root:/bin/bash

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

operator:x:11:0:operator:/root:/sbin/nologin

operator:x:11:0:operator:/root:/sbin/nologin

ooooqq

osdaoooo

postfix:x:89:89::/var/spool/postfix:/sbin/n1ogin

查找bus字符所在的行

[root@localhost sed]# sed -n '/bus/'p test.txt 

dbus:x:81:81:System message bus:/:/sbin/nologin

不区分大小写查找bus字符 (I 表示不区分大小写 grep -i 不区分大小写查找)

[root@localhost sed]# sed -n '/bus/'Ip test.txt 

dbus:x:81:81:System message bus:/:/sbin/nologin

polkitd:x:999:997:User for BUSpolkitd:/:/sbin/nologin

postfix:x:89:89::/var/spool/posBustfix:/sbin/nologin

删除1,10行,列出剩下的行(d 是delete删除) 不删除原来文件里面的内容,只是

显示的时候删除1到10行,显示剩下的内容。

[root@localhost sed]# sed '1,10'd test.txt 

games:x:12:100:games:/usr/games:/sbin/nologin

ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

nobody:x:99:99:Nobody:/:/sbin/nologin

systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin

dbus:x:81:81:System message bus:/:/sbin/nologin

polkitd:x:999:997:User for BUSpolkitd:/:/sbin/nologin

postfix:x:89:89::/var/spool/posBustfix:/sbin/nologin

chrony:x:998:996::/var/lib/chrony:/sbin/nologin

sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

xiaobo:x:1000:1000::/home/xiaobo:/bin/bash

删除1到25行内容,会删除原文件里面的内容! (-i)

[root@localhost sed]# sed  -i '1,25'd test.txt 

删除原文件里面的user2相关的行

[root@localhost sed]# sed -i '/user2/'d test.txt 

替换文件中1到10行 root字符替换成toor字符; s表示字符串;g(globle)全局

[root@localhost sed]# sed '1,10s/root/toor/g' test.txt 

可以使用正则表达式,将正则表达式的内容进行替换

替换 ro+ (正则表达式 加号表示1个或者多个字符) 把ro+ 替换为r

[root@localhost sed]# sed  -r '1,10s/ro+/r/g' test.txt |head 

rt:x:0:0:rt:/rt:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

sync:x:5:0:sync:/sbin:/bin/sync

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

halt:x:7:0:halt:/sbin:/sbin/halt

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

operator:x:11:0:operator:/rt:/sbin/nologin

head 显示

[root@localhost sed]# head test.txt 

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

sync:x:5:0:sync:/sbin:/bin/sync

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

halt:x:7:0:halt:/sbin:/sbin/halt

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

operator:x:11:0:operator:/root:/sbin/nologin

把第一段跟最后一段替换 (第一段 冒号之前,最后一段 冒号之后)

[^:]表示非冒号字符,一个字符不是冒号

+号表示一个或多个字符

分成3部分

用反斜杠 3 :表示第3段 ([^:]+)

2 :第二段 (.*)

1 第一段([^:]+)

[root@localhost sed]# head test.txt |sed  -r 's/([^:]+):(.*):([^:]+)/3:2:1/'

/bin/bash:x:0:0:root:/root:root

/sbin/nologin:x:1:1:bin:/bin:bin

/sbin/nologin:x:2:2:daemon:/sbin:daemon

/sbin/nologin:x:3:4:adm:/var/adm:adm

/sbin/nologin:x:4:7:lp:/var/spool/lpd:lp

/bin/sync:x:5:0:sync:/sbin:sync

/sbin/shutdown:x:6:0:shutdown:/sbin:shutdown

/sbin/halt:x:7:0:halt:/sbin:halt

/sbin/nologin:x:8:12:mail:/var/spool/mail:mail

/sbin/nologin:x:11:0:operator:/root:operator

把 /root 替换成123,/root 之前加一个反斜杠 脱义

[root@localhost sed]# head test.txt  |sed 's//root/123/g'

root:x:0:0:root:123:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

sync:x:5:0:sync:/sbin:/bin/sync

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

halt:x:7:0:halt:/sbin:/sbin/halt

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

operator:x:11:0:operator:123:/sbin/nologin

加反斜杠 脱义

[root@localhost sed]# head test.txt  |sed 's//sbin/nologin/123/g'

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:123

daemon:x:2:2:daemon:/sbin:123

adm:x:3:4:adm:/var/adm:123

lp:x:4:7:lp:/var/spool/lpd:123

sync:x:5:0:sync:/sbin:/bin/sync

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

halt:x:7:0:halt:/sbin:/sbin/halt

mail:x:8:12:mail:/var/spool/mail:123

operator:x:11:0:operator:/root:123

也可以用@ 分隔开

[root@localhost sed]# head test.txt  |sed 's@/sbin/nologin@123@g'

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:123

daemon:x:2:2:daemon:/sbin:123

adm:x:3:4:adm:/var/adm:123

lp:x:4:7:lp:/var/spool/lpd:123

sync:x:5:0:sync:/sbin:/bin/sync

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

halt:x:7:0:halt:/sbin:/sbin/halt

mail:x:8:12:mail:/var/spool/mail:123

operator:x:11:0:operator:/root:123

删除文件中所有字母, 用[a-zA-Z]来表示字母

[root@localhost sed]# head  test.txt  |sed 's/[a-zA-Z]//g'

::0:0::/://

::1:1::/://

::2:2::/://

::3:4:://://

::4:7::///://

::5:0::/://

::6:0::/://

::7:0::/://

::8:12::///://

::11:0::/://

在所有的行前面加上aaa字符,(.*)表示一整行,&/(and符号表示前面的小括号),添加字符为aaa:

[root@localhost sed]# head test.txt  |sed -r 's/(.*)/aaa:&/'

aaa:root:x:0:0:root:/root:/bin/bash

aaa:bin:x:1:1:bin:/bin:/sbin/nologin

aaa:daemon:x:2:2:daemon:/sbin:/sbin/nologin

aaa:adm:x:3:4:adm:/var/adm:/sbin/nologin

aaa:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

aaa:sync:x:5:0:sync:/sbin:/bin/sync

aaa:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

aaa:halt:x:7:0:halt:/sbin:/sbin/halt

aaa:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

aaa:operator:x:11:0:operator:/root:/sbin/nologin

shell脚本之sed使用—-替换、变量、转义字符

sed替换的基本语法为:

—-s后面跟的是分隔符,原字符串可使用.*这种正则表达式进行整行替换

代码如下:

sed 's/原字符串/替换字符串/'

单引号里面,s表示替换,三根斜线中间是替换的样式,特殊字符需要使用反斜线””进行转义,但是单引号”‘”是没有办法用反斜线””转义的,这时候只要把命令中的单引号改为双引号就行了,例如:

代码如下:

sed "s/原字符串包含'/替换字符串包含'/" //要处理的字符包含单引号

命令中的三根斜线分隔符可以换成别的符号,这在要替换的内容有较多斜线是较为方便,只需要紧跟s定义即可,例如换成问号”?”:

代码如下:

sed 's?原字符串?替换字符串?' //自定义分隔符为问号

可以在末尾加g替换每一个匹配的关键字,否则只替换每行的第一个,例如:

代码如下:

sed 's/原字符串/替换字符串/' //替换所有匹配关键字

上箭头”^”表示行首,美元”$”符号如果在引号中表示行尾,但是在引号外却表示末行(最后一行),这里犯二了,搜了半天哪个符号表示首行,半天才想起来,首行就是数字”1″啊.那么在行首和行尾添加字符串就是把行尾和行首替换,例如:

代码如下:

sed 's/^/添加的头部&/g' //在所有行首添加 
sed 's/$/&添加的尾部/g' //在所有行末添加 
sed '2s/原字符串/替换字符串/g' //替换第2行 
sed '$s/原字符串/替换字符串/g' //替换最后一行 
sed '2,5s/原字符串/替换字符串/g' //替换2到5行 
sed '2,$s/原字符串/替换字符串/g' //替换2到最后一行

替换样式可以多个在同一条命令中执行,用分号”;”分隔,例如:

代码如下:

sed 's/^/添加的头部&/g;s/$/&添加的尾部/g' //同时执行两个替换规则

sed处理过的输出是直接输出到屏幕上的,要保存可以将输出重定向,或者使用参数”i”直接在文件中替换:

代码如下:

sed -i 's/原字符串/替换字符串/g' filename //替换文件中的所有匹配项

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

首先是Sed里使用变量的问题

网上有人总结了四种方案:

1.       eval sed 's/$a/$b/' filename

2.       sed "s/$a/$b/" filename

3.       .sed 's/'$a'/'$b'/' filename

4.       .sed s/$a/$b/ filename

我比较喜欢第二种,也就是:Sed后面的表达式一般用单引号引起来(’),当需要使用变量时就换用双引号(”)。

关于单双引号的区别:

单引号:shell处理命令时,对其中的内容不做任何处理。即此时是引号内的内容是sed命令所定义的格式。

双引号:shell处理命令时,要对其中的内容进行算术扩展。如果想让shell扩展后得到sed命令所要的格式,使用命令:sed -n “/\\$/p” haha,扩展后得到的结果即\$.

因此对于语句类似:

$Comfilename="/home/evan/sandbox/Main/"
  1. echo $Comfilename | sed ‘s#/#\/#g’

  2. echo $Comfilename | sed “s#/#\/#g”

第一个的结果是:/home/evan/sandbox/Main/

而第二个还是:/home/evan/sandbox/Main/ 因为双引号会将“/“解释为”/“,所以sed “s#/#\/#g”被Shell解释成了sed s#/#/#g 到sed里执行时又把”/“转义为”/“了,这样相当于进行了了两次解释,就得不到想要的结果了。

这个例子告诉我当没必要用双引号的的时候就不要用,要不然说不定什么时候你就会很郁闷。Sed使用的变量里含有转义字符的解决当然单引号效率要比双引号高也是不要滥用双引号的原因之一。

言归正传,如何在sed的变量里使用那些特殊的需要转义的字符呢?

网上提出的一种方法是将sed里表示替换用的s后面的表示分隔用的字符换成别的变量里没有的字符这样就相当于变量里没有要转义的字符了。

如:

sed –i "s# $Comfilename#/Root/#" filename.list

这是一个好办法。但很不幸我需要的是删除“d”不是替换“s“。当我把同样的方法用于删除时似乎没有起到作用:sed –i “# $Comfilename#d” filename.list

于是只能自己手工先改写变量

$Comfilename="/home/evan/sandbox/Main/"
Tempname=` echo $Comfilename | sed 's#/#\/#g'`

(这里把反单引号执行的结果给临时变量,同样的方法可以改写其他需要转义的符号。)

sed –i "# $ Tempname #d" filename.list

sed的增删改查、sed常见问题

本章正题:sed的使用、sed常见问题

1.1 SED

1.1.1 sed是什么 :全称字符流编辑器Stream Edite

1.1.2 sed功能与版本

  1. 处理纯文本文件、日志、配置文件
  2. 增删改查
  3. 查看sed版本:sed –version

1.1.3 语法格式

  1. sed [选项] [sed指令] [输入文件]
  2. sed -i.bak ‘s#oldboy#oldbgirl#g’ oldboy.txt
  3. -i —sed命令的参数
  4. s –sed指令
  5. g —就是个修饰

1.1.4 sed命令的实行过程

  1. 把内容读取到内存中(模式空间)
  2. 判断是否是满足我要的条件(默认都会显示到屏幕)
    1. sed有个默认输出所以不加-n,都会显示到屏幕
  3. 继续读取直到最后一行

未分类

1.1.5 sed常用功能

实验环境:

[root@georgekai ~]# vim person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO

实例1-1 查询p(print)

1、单行 – 行号

[root@georgekai ~]# sed -n '3p' person.txt

2、找出包含oldboy的行

[root@georgekai ~]# sed -n '/oldboy/p' person.txt

注://中间可以写需要找的内容

3、多行连续显示(知道行号)

[root@georgekai ~]# sed -n '1,3p' person.txt

4、多行连续显示,显示包含oldboy的行到包含yy的行(不知道行号,模糊查找)

[root@georgekai ~]# cat person.txt|sed -n '/oldboy/,/yy/p'

5、显示不连续的行

[root@georgekai ~]# nl person.txt |sed -n '1p;3p;4p'

注:sed或awk中,加多个命令,用分号分割(;)

实例1-2 增加

1、在文件最后一行增加俩行

方法一:[root@georgekai ~]# echo -e “106,wuxingge,UFOn107,lee,XO” >>person.txt

方法二:[root@georgekai ~]# nl person.txt |sed -n ‘$a 106,wixingge,UFOn107,lee,XO.p’

注:1. 这里的$表示最后一行,a前面可加行号
2. a === append追加,当前行的下一行追加
3. i === insert插入,当前行的上一行插入
4. 中间的n ,表示回车键

方法三:[root@georgekai ~]# cat >> person.txt <<EOF
EOF

实例1-3 删除

1、单行删除

[root@georgekai ~]# nl person.txt |sed '1d' -i

2、多行删除

[root@georgekai ~]# cat person.txt |sed '/old/,/yy/d'
root@georgekai ~]# cat person.txt|sed '1d;3d;4d;5d'

3、不显示文件的空行

方法一:[root@georgekai ~]# cat person.txt |grep -v ‘^$’
方法二:[root@georgekai ~]# cat person.txt |sed -n ‘/^$/!p’
注:!在sed中也是取反的意思
方法三:[root@georgekai ~]# cat person.txt |sed ‘/^$/d’
方法四:[root@georgekai ~]# cat person.txt |awk ‘!/^$/’

实例1-4 替换s

注:在“s###g”中遇到以#开头的条件,3个#可以用3个@代替

1、不加小g,默认只替换每一行的第一个找到的条件

[root@georgekai ~]# sed 's#[1-9]#AAAA#' person.txt

注:后面加g,会替换每一行满足条件的所有

2、备份

[root@georgekai ~]# sed -i.bak.$(date +%F) 'sg#old#boy#' person.txt

注:先备份源文件,在修改源文件的内容

3、sed中变量的使用

[root@georgekai ~]# x=oldboy
[root@georgekai ~]# y=oldgirl
[root@georgekai ~]# sed "s#$x#$y#g" person.txt

注:sed的使用变量需要用双引号

4、单引号与双引号区别

[root@oldboyedu43-lnb oldboy]# echo 'I'am lee'
> ^C
[root@oldboyedu43-lnb oldboy]# echo "I'am lee"
I'am lee
[root@oldboyedu43-lnb oldboy]# echo 'I"am" lee'
I"am" lee

实例1-5 反向引用(先保护,在使用)

1、&符号的作用

[root@georgekai ~]# echo '123456' |sed -r 's#.#<&>#g'
<1><2><3><4><5><6>

注:& 表示前俩个#号中间正则匹配到的所有内容

2、命令拼接,批量修改文件名称

创建环境:

[root@georgekai ~]# touch oldboy{01..10}.jpg

如何修改:

方法一:[root@georgekai ~]# ls oldboy.avi|sed -r ‘s#(.).avi#mv & 1.jpg#g’|bash

注:1.bash的作用,执行前面管道后输出的内容
2.& 表示前俩个#号中间正则匹配到的所有内容
3.1 表示前面()中的内容

方法二:把以txt结尾的文件,中的txt替换成jpg

[root@georgekai ~]# rename txt jpg old*.txt
[root@georgekai ~]# ls
oldboy01.jpg  oldboy04.jpg  oldboy07.jpg  oldboy10.jpg
oldboy02.jpg  oldboy05.jpg  oldboy08.jpg  person.txt
oldboy03.jpg  oldboy06.jpg  oldboy09.jpg

格式:

rename    form                 to                       file
     要替换的源内容是什么       替换成什么内容             替换哪些文件
          jpg                                          avi                                                       *.jpg

1.1.6 使用sed命令的常见问题

  1. -r与-i同时使用
    -ri (正常):先使用扩展正则,在修改文件内容
    -ir :先备份文件名为“什么什么r”的备份文件,然后在替换源文件中的内容

  2. -i禁止与-n一起使用
    如:sed -ni ‘1p’ person.txt 会把源文件内容清空,只留下第一行