linux 命令: sed、awk、grep

Linux sed命令完全攻略(超级详细):https://c.biancheng.net/view/4028.html

Linux awk 命令详解:https://c.biancheng.net/view/4082.html

Linux grep命令详解:查找文件内容:https://c.biancheng.net/view/4017.html

1、sed 命令

sed 简介

Vim 采用的是交互式文本编辑模式,你可以用键盘命令来交互性地插入、删除或替换数据中的文本。但 sed 命令不同,它采用的是流编辑模式,最明显的特点是,在 sed 处理数据之前,需要预先提供一组规则,sed 会按照此规则来编辑数据。所以,sed (Stream Editor) 是一个 "非交互式的" 面向字符流文本流编辑器

sed 会根据脚本命令来处理文本文件中的数据,这些命令要么从命令行中输入,要么存储在一个文本文件中,此命令执行数据的顺序如下:

  1. 每次仅读取一行内容;
  2. 根据提供的规则命令匹配并修改数据。注意,sed 默认不会直接修改源文件数据,而是会将数据复制到缓冲区中,修改也仅限于缓冲区中的数据;
  3. 将执行结果输出。

sed 主要是 以行为单位 进行处理,在处理文本时是逐行读取文件内容,读到匹配的行就根据指令做操作,不匹配就跳过。当一行数据匹配完成后,它会继续读取下一行数据,并重复这个过程,直到将文件中所有数据处理完毕。可以对数据行进行 "增、删、改、查" 等操作。支持按行、按字段、按正则匹配文本内容,灵活方便,特别适合于大文件的编辑。

sed 命令行格式为 :(命令  必须以 '' 单引号引起来)

  • sed [OPTION]... {script-only-if-no-other-script} [input-file]...
  • sed [选项] -f sed脚本文件 输入文件
  • sed [-hnV] [-e <script>] [-f <script文件>] [文本文件]

组合多个表达式:sed '表达式' | sed '表达式'     等价于:sed '表达式; 表达式'

sed 命令常用选项及含义

  • -e 脚本命令    该选项会将其后跟的脚本命令添加到已有的命令中。
  • -f 脚本命令文件    该选项会将其后文件中的脚本命令添加到已有的命令中。
  • -n    默认情况下,sed 会在所有的脚本指定执行完毕后,会自动输出处理后的内容,而该选项会屏蔽启动输出,需使用 print 命令来完成输出。
  • -i    此选项会直接修改源文件,要慎用。

sed 常用 "选项、命令"

sed 常用 选项。查看 sed 选项:sed --help

  • -n 或 --quiet 或 --silent  安静模式,sed 默认会输出所有文本内容,-n 表示只显示处理过的行

    cp /etc/passed /data
    cd /data
    sed 's/:/\n/p' passwd | sed '1~2p'
    sed -n 's/:/\n/p' passwd | sed -n '1~2p'
    sed -n 's/:.*//gp' /etc/passwd

  • -e <script> 或 --expression=<script>  告诉 sed 将下一个参数解释为一个 sed 指令,只有当命令行上给出多个sed指令时才需要使用 -e 选项
  • -f <script文件> 或 --file=<script文件> 后跟保存了 sed 指令的文件,以选项中指定的 script 文件来处理输入的文本文件。sed脚本是一个sed的命令清单,启动Sed时以-f选项引导脚本文件名。Sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,
    如果在一行中有多个命令,要用分号分隔。以#开头的行为注释行,且不能跨行。
    sed [options] -f scriptfile file(s)
  • -h 或 --help 显示帮助。
  • -i:直接对内容进行修改,不加 -i 时默认只是预览,不会对文件做实际修改
  • -r:支持扩展正则表达式。(默认是基础正则表达式)
  • -i∶直接修改读取的档案内容,而不是由萤幕输出。
  • -V 或 --version 显示版本信息。

sed 常用 命令。man sed:https://www.man7.org/linux/man-pages/man1/sed.1.html

  • a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
  • c :替换, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行。或者 整行替换
  • d :删除,因为是删除,所以 d 后面什么都没有;
            D 删除模板块的第一行。
  • g :获得内存缓冲区的内容,并替代当前模板块中的文本。 
            G 获得内存缓冲区的内容,并追加到当前模板块文本的后面。 
  • h :拷贝模板块的内容到内存中的缓冲区。 
            H 追加模板块的内容到内存中的缓冲区。 
  • i :插入。后面可以接字串,而这些字串会在新的一行出现(当前行的的上一行); (会修改原始文件,谨慎使用);
  • l :列出不能打印字符的清单。
  • n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。 
            N 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
    打印奇数行或偶数行
        方法1:
            sed -n 'p;n' test.txt #奇数行
            sed -n 'n;p' test.txt #偶数行
        方法2:
            sed -n '1~2p' test.txt #奇数行
            sed -n '2~2p' test.txt #偶数行  
  • p :打印模板块的行。亦即将某个选择的数据印出。通常 p 会与参数sed -n 一起使用
            P(大写) 打印模板块的第一行
  • s :同一行内进行替换,不能跨行。s 通常是和正则表达式。例如 1,20s/old/new/g
  • = :输出行号
  • r :将文件的内容读入 read
  • w :将文本写入文件 write
  • q :退出 Sed

b lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。 
r file 从file中读行。 
t label if分支,从最后一行开始,条件一旦满足或者T,t命令,
              将导致分支到带有标号的命令处,或者到脚本的末尾。 
T label 错误分支,从最后一行开始,一旦发生错误或者T,t命令,
          将导致分支到带有标号的命令处,或者到脚本的末尾。 
w file 写并追加模板块到file末尾。 
W file 写并追加模板块的第一行到file末尾。 
! 表示后面的命令对所有没有被选定的行发生作用。 
= 打印当前行号码。 
# 把注释扩展到下一个换行符以前。

sed 执行流程

sed 编辑器逐行处理文件,并将输出结果打印到屏幕上。sed命令将当前处理的行读入模式空间(pattern space)进行处理,sed 在该行上执行完所有命令后就将处理好的行打印到屏幕上(除非之前的命令删除了该行),sed 处理完一行就将其从模式空间中删除,然后将下一行读入模式空间,进行处理、显示。处理完文件的最后一行,sed 便结束运行。sed在临时缓冲区(模式空间)对文件进行处理,所以不会修改原文件,除非显示指明 -i 选项。

sed 执行原理

  • g :获得内存缓冲区的内容,并替代当前模板块中的文本。 
            G 获得内存缓冲区的内容,并追加到当前模板块文本的后面。 
  • h :拷贝模板块的内容到内存中的缓冲区。 
            H 追加模板块的内容到内存中的缓冲区。 

将文件的内容逆序输出。下面是命令的详细解释:sed '1!G;h;$!d' num.txt

  • 1!G:对于第一行之外的所有行,执行 G 命令,将模式空间中的内容与保持空间(暂存区)中的内容进行交换。这样做会将当前行追加到保持空间中。
  • h:将模式空间中的内容复制到保持空间中,覆盖原来的内容。这样做是为了保留每行的顺序。
  • $!d:对于最后一行之外的所有行,删除模式空间中的内容,即只保留最后一行。

这个命令会将 num.txt 文件的内容以逆序输出。它将最后一行作为起始行,并依次向上输出每一行,直到第一行。这样就实现了逆序输出的效果。

模式空间(pattern space)、暂存空间(hold space)

保持和获取:h命令和G命令

在 sed 处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中,除非行被删除或者输出被取消,否则所有被处理的行都将 打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理。

示例:sed -e '/test/h' -e '$G' file

解释:匹配 test 的行被找到后,将存入模式空间,h命令将其复制并存入一个称为保持缓存区的特殊缓冲区内。第二条语句的意思是,当到达最后一行后,G命令取出保持缓冲区的行,然后把它放回模式空间中,且追加到现在已经存在于模式空间中的行的末尾。在这个例子中就是追加到最后一行。简单来说,任何包含test的行都被复制并追加到该文件的末尾。

保持和互换:h命令和x命令 

互换模式空间和保持缓冲区的内容。也就是把包含test与check的行互换:sed -e '/test/h' -e '/check/x' file

n 输出模式空间行,读取下一行替换当前模式空间的行,执行下一条处理命令而非第一条命令。
N 读入下一行,追加到模式空间行后面,此时模式空间有两行。
h 把模式空间里的行拷贝到暂存空间。
H 把模式空间里的行追加到暂存空间。
g 用暂存空间的内容替换模式空间的行。
G 把暂存空间的内容追加到模式空间的行后。
x 将暂存空间的内容于模式空间里的当前行互换。
!对所选行以外的所有行应用命令。

d 删除模式空间的内容并导致读入新的输入行,从而在脚本的顶端重新使用编辑方法

D 删除模式空间中直到第一个嵌入的换行符的这部分内容。它不会导致读入新的输入行,相反,它返回到脚本的顶端,将这些指令应用于模式空间剩余的内容

注意:暂存空间里默认存储一个空行。

2!G  不是第二行的时候进行G操作

$!d 不是最后一行的时候进行d操作,是最后一行就不进行d操作

行号是 sed 读取文件里的第几行

sed 2种操作方式:操作、模式匹配 操作

"增、删、改、查" 都有下面2种方式进行操作。

  • 根据行号:
  • 模式匹配

a 追加 的两个操作示例:

  • 根据行号 追加:sed '1a aaaaa' /etc/fstab    在第一行下新起一行追加后面的字符串
  • 根据模式匹配 追加:sed '/boot/r aaaaa' /etc/fstab    在包含boot的行下面追加后面的字符串

sed -i '$a bye'  test_file.txt        在文件 test_file.tx 中最后一行直接输入"bye"

正则 元字符

  • sed 使用正则 替换: sed 's/字符串1/字符串2/标志位'
  • 替换匹配行中的某个字符串
    sed -i '/匹配字符串/s/替换源字符串/替换目标字符串/g' filename
  • sed 使用正则 查找: sed '/字符串1/标志位'

示例:在所有三位数字后面加个0

命令:sed -nr 's/\<[0-9]{3}\>/&0/gp' /etc/passw

^     匹配行开始,如:/^sed/匹配所有以sed开头的行。 
$     匹配行结束,如:/sed$/匹配所有以sed结尾的行。 
.     匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。 
*     匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。 
[]    匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed。 
[^]   匹配一个不在指定范围内的字符。
      如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。 
\(..\)    匹配子串,保存匹配的字符。如s/\(love\)able/\1rs,loveable被替换成lovers。 
&     保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。 
\<    匹配单词的开始,如:/\<love/匹配包含以love开头的单词的行。
>/    匹配单词的结束,如:/love\>匹配包含以love结尾的单词的行。 
x\{m\}     重复字符x,m次,如:/0\{5\}/匹配包含5个0的行。 
x\{m,\}    重复字符x,至少m次,如:/0\{5,\}/匹配至少有5个0的行。 
x\{m,n\}   重复字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10个0的行。

标志位:g、p、w、x、y、\1、&

g    表示行内全部替换。如果不加则表示只替换匹配到的第一个 。
p    表示打印行。 
w    表示把行写入一个文件。 
x    表示互换模板块中的文本和缓冲区中的文本。 
y    表示把一个字符翻译为另外的字符(但是不用于正则表达式) 
\1   子串匹配标记 
&    已匹配字符串标记

& 表示 已匹配字符串标记

echo 'I have a fat cat' | sed 's/.at/".at"/g'
echo 'I have a fat cat' | sed 's/.at/"&"/g'

子串匹配标记 \1 匹配给定样式的其中一部分: 

    echo this is digit 7 in a number | sed 's/digit \([0-9]\)/\1/' 
    this is 7 in a number 
    命令中 digit 7,被替换成了 7。样式匹配到的子串是 7,\(..\) 用于匹配子串,
    对于匹配到的第一个子串就标记为 \1,依此类推匹配到的第二个结果就是 \2,例如: 
    echo aaa BBB | sed 's/\([a-z]\+\) \([A-Z]\+\)/\2 \1/' 
    BBB aaa 
    love被标记为1,所有loveable会被替换成lovers,并打印出来: 
    sed -n 's/\(love\)able/\1rs/p' file

sed 单引号、双引号

"sed的表达式(模式)" 可以使用单引号来引用,但是如果表达式内部包含变量字符串,就需要使用双引号。 

test=hello
echo hello WORLD | sed "s/$test/HELLO"
HELLO WORLD

正确 示例:sed -n "${a},${b}p" /etc/passwd

错误 示例:sed -n '${a},${b}p' /etc/passwd

示例:sed 编辑 命令

简单示例

  • sed -n 's/:/\n/p' passwd | sed -n '1~2p'        sed 取出/etc/passwd文件的第一列
  • sed -n 's/:/\\n/gp' path.txt       将PATH环境变量中的冒号换成换行 \n
  • sed -i 's/\//\\/g' path.txt        将PATH环境变量斜杠/换成斜杠\
  • sed '/^games/ s/$/test_test/p' passwd        修改games 开头的行,结尾修改成 test_test
  • sed -n 's/:x:/::/pg' passwd        去掉 /etc/passwd 文件中第二个字段的x

示例:sed -i 's/^#\s*Port\s\+\S\+$/Port 8889/' ssh_config

将以 # Port 开头的行替换为 Port 8889,而保留其他配置项不变:

  • ^#\s*Port\s\+\S\+$ 表示匹配以 # 开头,后面有零个或多个空格,然后是 Port 关键字,后面再跟一个或多个非空白字符(即原始端口号),最后以行尾结束。这个正则表达式确保只匹配注释掉的原始端口号配置项。
  • s 命令将匹配的字符串替换为 Port 8889,实现端口号的修改。
  • -i 参数表示直接修改文件内容,而不是在屏幕上输出结果。

示例:正则 查找 行

  • sed 正则 替换: sed 's/old_string/new_string/标志位'   其中 old_string 可以用正则表达式
  • sed 正则 查找: sed '/find_string/标志位'

示例:sed -n '/ruby/p' ab | sed 's/ruby/bird/g'     # 查找ruby的行,然后替换ruby为bird

示例:sed -n '/ruby/p' ab | sed 's/ruby//g'         # 查找ruby的行,然后删除ruby

示例:查询包括关键字 root 的所有行

命令:sed -n '/root/p' /etc/passwd

打印行号:sed -n '=' /etc/passwd | sed 'N; s/\n/ /'

  • sed -n '=' test.txt 命令用于打印每一行的行号。
  • sed 'N; s/\n/ /' 命令用于将行号和对应的文本合并到一行,并用空格分隔行号和文本。

示例:, (逗号):选定行的范围 

示例文件:cat test_file.txt  #查看 test_file.txt 中的内容  

HELLO LINUX!  
Linux is a free unix-type opterating system.  
This is a linux testfile!  
Linux test 
Google
Taobao
Runoob
Tesetfile
Wiki

  • sed -n '/Google/,/Tesetfile/p' test_file.txt        在 Google 和 Tesetfile 之间的行都打印出来
  • sed -n '2,/^Google/p' test_file.txt        打印从第2行开始到第一个包含以Google开始的行之间的所有行
  • sed '/Google/,/Runoob/s/$/aaa bbb/' test_file.txt        对于Google和Runoob之间的行,每行的末尾用字符串aaa bbb替换

示例:p 命令 (print 打印)

q 退出命令,打印完第10行后退出:sed sed '10q' file

显示某行
        sed -n '1p' test_file.txt     # 显示第一行
        sed -n '$p' test_file.txt     # 显示最后一行
        sed -n '1,2p' test_file.txt   # 显示第一行到第二行
        sed -n '2,$p' test_file.txt   # 显示第二行到最后一行

sed -n '5p' /etc/passwd      # 显示第5行
sed -n '1,5p' /etc/passwd    # 显示第1至5行
sed -n '1p;5p' /etc/passwd   # 显示第1行和第5行
cat -n /etc/passwd | sed -n '5,100!p'  # 取反,取1到4行
sed -n '2,+2p' /etc/passwd   # 显示第2行和其后面两行
sed -n '$p' /etc/passwd      # 显示最后一行
sed -n '1~3p' /etc/passwd    # 从第一行起,每间隔3行输出一行

打印匹配字符串的下一行 
    grep -A 1 SCC URFILE 
    sed -n '/SCC/{n;p}' URFILE 
    awk '/SCC/{getline; print}' URFILE

示例:s 命令 (string 行操作)

  • s后面的  是界定符,如果省略,默认是 /
  • 同一行内进行替换,不能跨行。s 通常是和正则表达式。例如 1,20s/old/new/g

定界符 

    s命令后面紧跟的 / 在sed中作为定界符使用,也可以使用任意的定界符: 
        sed 's:test:TEXT:g' 
        sed 's|test|TEXT|g' 
    
    定界符出现在样式内部时,需要进行转义: 
        sed 's/\/bin/\/usr\/local\/bin/g'

s 命令 可以使用任意分隔符作为定界符

        以 / 作为 分隔符
        sed -n '/^hello/s/\/bin\/bash/\/sbin\/nologin/p' /etc/passwd
        以 | 作为 分隔符
        sed -n '/^hello/s|/bin/bash|/sbin/nologin|p' /etc/passwd
        以 :作为 分隔符
        sed -n '/^hello/s:/bin/bash:/sbin/nologin:p' /etc/passwd

sed 的 s 命令中支持 \t \n

sed -n 's/^xixi/\n1111111111111111/p' /etc/passwd
sed -n 's/^xixi/\t1111111111111111/p' /etc/passwd
sed 's/^abrt.*/&\n/' passwd

替换操作:s 命令

    替换文本中的字符串:
        sed 's/book/books/' file
    
    -n 选项和 p命令 一起使用表示只打印那些发生替换的行:
        sed -n 's/test/TEST/p' file
    
    直接编辑文件选项-i,会匹配file文件中每一行的第一个book替换为books:
        sed -i 's/book/books/g' file
    
    全面替换标记g 使用后缀 /g 标记会替换每一行中的所有匹配:
        sed 's/book/books/g' file
    
    当需要从第N处匹配开始替换时,可以使用 /Ng:
        echo sksksksksksk | sed 's/sk/SK/2g'
        skSKSKSKSKSK
        echo sksksksksksk | sed 's/sk/SK/3g'
        skskSKSKSKSK
        echo sksksksksksk | sed 's/sk/SK/4g'
        skskskSKSKSK

sed -n '2,10s/^/#/p' passwd      在2到10行前面加上注释
sed -n 's/$/?/p' passwd             在每行末尾加上?
将/etc/selinux/config的SELINUX参数改为disabled:sed -n '/^SELINUX=/s|enforcing|disabled|p' /etc/selinux/config   s后面的  是界定符,如果省略,默认是 /

示例:c 命令 (change 修改)

更改整行操作可以根据行号和模式匹配进行操作

  • 修改 符合条件的行:sed '/id:/c id:5:initdefault:' /etc/inittab    将 id:所在的行整行替换成后面的字符串
  • 直接修改整行:
    sed '3c ONBOOOT=no' ifcfg-eth0  将第3行改成后面的字符串
    sed '1,2c Hi' ab       第一行到第二行代替为Hi

示例:r 命令 (read 读入)

在 fstab 文件的末尾后面读入hosts文件的内容

sed '$r /etc/hosts' /etc/fatab
df -h | sed '/dev/sda1/r /etc/mtab'

从文件读入:r命令 
    file里的内容被读进来,显示在与test匹配的行后面,
    如果匹配多行,则file的内容将显示在所有匹配行的下面: 
    sed '/test/r file' filename 
    写入文件:w命令   
    在example中所有包含test的行都被写入file里: 
    sed -n '/test/w file' example

示例:a 命令 (append 追加)

  • 根据行号 追加:sed '1a aaaaa' /etc/fstab    在第一行下新起一行追加后面的字符串
  • 根据模式匹配 追加:sed '/boot/r aaaaa' /etc/fstab    在包含boot的行下面追加后面的字符串

追加(行下):a\命令 
    将 this is a test line 追加到 以test 开头的行后面: 
    sed '/^test/a\this is a test line' file 
    在 test.conf 文件第2行之后插入 this is a test line: 
    sed -i '2a\this is a test line' test.conf 

sed '1a drink tea' ab  #第一行后增加字符串"drink tea"

sed '1,3a drink tea' ab #第一行到第三行后增加字符串"drink tea"

sed '1a drink tea\nor coffee' ab     #第一行后增加多行,使用换行符\n

示例:i 命令 (编辑)

会修改原始文件,谨慎使用!!!

sed '$i 1111111111111' /etc/fstab    在最后一行的前面插入后面的字符串
sed '/defaults/i 1111111111111' /etc/fstab    在包含defaults的行前面插入后面的字符串

插入(行上):i\命令 
    将 this is a test line 追加到以test开头的行前面: 
    sed '/^test/i\this is a test line' file 
    在test.conf文件第5行之前插入this is a test line: 
    sed -i '5i\this is a test line' test.conf

  • -i 参数表示直接修改文件内容,而不是在屏幕上输出结果。
  • /p 参数用于打印匹配的行
  • 同时使用时,因为 -i 参数已经将结果写回了文件,所以 /p 参数并不会产生任何效果

示例:d 命令 (delete 删除)

删除某行
       sed '1d' ab          # 删除第一行 
       sed '$d' ab          # 删除最后一行
       sed '1,2d' ab        # 删除第一行到第二行
       sed '2,$d' ab        # 删除第二行到最后一行

        sed '3,5d' /etc/fstab    删除第3到5行
        sed '/2/d' /etc/fstab    删除包含2的行
        sed '/ext3/!d' /etc/fstab    除了包含ext3的行都删

删除空行和注释
        sed -r '/^$|^#/d' /etc/inittab
        sed -e '/^$/d'  -e '/^#/d' /etc/inittab
        sed -r '/^$/d;/^#/d' /etc/inittab

删除操作:d命令 

    删除空白行: 
        sed '/^$/d' file 
    删除文件的第2行: 
        sed '2d' file 
    删除文件的第2行到末尾所有行: 
        sed '2,$d' file 
    删除文件最后一行: 
        sed '$d' file 
    删除文件中所有开头是test的行: 
        sed '/^test/'d file

示例:e 命令 ( 多点 编辑 )

多点编辑:e命令 

    -e选项允许在同一行里执行多条命令: 
    sed -e '1,5d' -e 's/test/check/' file 
    上面sed表达式的第一条命令删除1至5行,第二条命令用check替换test。
    命令的执行顺序对结果有影响。如果两个命令都是替换命令,
    那么第一个替换命令将影响第二个替换命令的结果。 
    和 -e 等价的命令是 --expression: 
    sed --expression='s/test/check/' --expression='/love/d' file

示例: N 命令

编辑一个文件 test.txt,内容如下:
0.0.0.0
1.1.1.1
2.2.2.2
输出以下形式:
0.0.0.0:80,1.1.1.1:80,2.2.2.2:80

命令:sed -i 'N;N;s/\n/:80,/g;s/$/:80/' test.txt

  • -i:表示原地编辑,即直接修改文件内容。
  • 'N;N;s/\n/:80,/g;s/$/:80/':这是 sed 的脚本部分。在这个脚本中,首先使用 N;N 命令读取两行文本(将两行文本缓存起来),然后使用替换命令 s/\n/:80,/g 将每行中的换行符 \n 替换为 :80,,最后使用 s/$/:80/ 在每行末尾添加 :80

该命令将会将 test_file.txt 中的内容进行修改,并将每两行文本之间的换行符替换为 :80,,并在每行末尾添加 :80

sed 标签

标签:sed 使用圆括号定义替换模式中的部分字符;相当于python里的正则分组

标签可以方便在后面引用,每行指令最多添加9个指令,相当于python里的引用分组

sed -r 's/(^[[:alnum:]]+)(.*)/\1/' /etc/passwd
sed -r 's/(^[[:alnum:]]+)(.*)/\2/' /etc/passwd
echo aaa bbb ccc | sed -r 's/([a-z]+)([a-z]+)([a-z]+)/\3 \2 \1/'

搜索、显示

搜索 /etc/passwd 有 root 关键字的行:nl /etc/passwd | sed '/root/p'
使用 -n 的时候将只打印包含模板的行:nl /etc/passwd | sed -n '/root/p'

搜索、删除

删除 /etc/passwd 所有包含 root 的行,其他行输出:nl /etc/passwd | sed  '/root/d'

搜索、执行命令

搜索 /etc/passwd,找到 root 对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把 bash 替换为 blueshell,再输出这行:nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p}'

如果只替换 /etc/passwd 的第一个 bash 关键字为 blueshell,就退出:nl /etc/passwd | sed -n '/bash/{s/bash/blueshell/;p;q}' 

搜索、替换

除了整行的处理模式之外, sed 还可以用行为单位进行部分数据的搜寻并取代。基本上 sed 的搜寻与替代的与 vi 相当的类似!他有点像这样:sed 's/要被取代的字串/新的字串/g'

将 IP 前面 的部分予以删除:[root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g'

将 IP 后面 的部分予以删除:[root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'

多点 编辑

一条 sed 命令,删除 /etc/passwd 第三行到末尾的数据,并把 bash 替换为 blueshell
nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/'

-e 表示多点编辑
    第一个编辑命令删除 /etc/passwd 第三行到末尾的数据
    第二条命令搜索 bash 替换为 blueshell。

修改 文件内容

sed 可以直接修改文件的内容,不必使用管道命令或数据流重导向! 不过,由於这个动作会直接修改到原始的文件,所以请你千万不要随便拿系统配置来测试! 我们还是使用下载的 regular_express.txt 文件来测试看看吧!

利用 sed 将 regular_express.txt 内每一行结尾若为 . 则换成 !

sed -i 's/\.$/\!/g' regular_express.txt

利用 sed 直接在 regular_express.txt 最后一行加入『# This is a test』

sed -i 's/\.$/\!/g' regular_express.txt

由於 $ 代表的是最后一行,而 a 的动作是新增,因此该文件最后新增『# This is a test』!

sed 的『 -i 』选项可以直接修改文件内容,这功能非常有帮助!举例来说,如果你有一个 100 万行的文件,你要在第 100 行加某些文字,此时使用 vim 可能会疯掉!因为文件太大了!那怎办?就利用 sed 啊!透过 sed 直接修改/取代的功能,你甚至不需要使用 vim 去修订!

匹配行 的 下一行

如果 test 被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb,并打印该行,然后继续:sed '/test/{ n; s/aa/bb/; }' file

变形:y命令

把1~10行内所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令:sed '1,10y/abcde/ABCDE/' file

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值