写在前面:
博客书写牢记5W1H法则:What,Why,When,Where,Who,How。
本篇主要内容:
● sed 命令用法
sed
stream editor for filtering and transforming text
sed会将整行读取到模式空间(pattern space),在模式空间进行处理后,根据处理动作进行操作(默认输出),直到读取新的行,将模式空间的原有行覆盖,除非手动干预。而模式空间的内容也可以转移到保留空间,保留空间可以保留更多行,以供其他操作。
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
OPTION
-n, --quiet, --silent:取消默认的打印行为
-e script, --expression=script:指定一个新的表达式,可以有多个同时使用
-f script-file, --file=script-file:指定脚本文件
-i[SUFFIX], --in-place[=SUFFIX]:直接修改原文件内容
-c, --copy:与-i一起使用,修改原文件的同时,将未修改的文件复制一份并命名为“原文件名+c”
-r, --regexp-extended:支持正则表达式
-z, --null-data:以空字符(null)分割行。可以指定此选项,来保证只处理第一个找到的行
script:
[地址定界] [字符处理或整行处理]
中间以空格隔开,可以多个空格
地址定界:
空:每一行
#:指定某行
#,#...:指定某几行
#,+#:从第#行开始的,往后#行
$:最后一行
1~2:从第1行开始,步进为2。即所有奇数行
5,~3 :从第5行开始,直到3的第一个整数倍的行停止
/regexp/ 或 \0regexp0:正则表达式匹配的行,"0"也可替换为其他字符
#,/PAT1/:从第#行开始,知道匹配到PAT1的行
/PAT1/,/PAT2/:从匹配到PAT1的行开始,到匹配到PAT2的行结束
整行处理:
仅对匹配空间的行进行处理操作。
= :显示行号。会在行的前面新建一行行号
a \TEXT :在匹配到的行的下方插入一行,内容为TEXT。"/"标记TEXT的开头。
i \ :在匹配到的行的上方插入一行,内容为TEXT。"/"标记TEXT的开头。
q [退出码] :执行完本行处理后立即退出。如果给出退出码,则将退出码设置为指定退出码。
Q [退出码] :不执行本行处理,直接退出。如果给出退出码,则将退出码设置为指定退出码。
r FILENAME :读取FILENAME的内容,并插入到匹配行的行后
R FILENAME :读取FILENAME的内容,并一行行插入到匹配行的行后。如第1个匹配到的行的行后只会插入文件的第1行,第2个匹配到的行行后插入文件的第2行。
c \TEXT :替换匹配行的内容为TEXT
d :删除匹配到的行
h H :读取/追加模式空间内容到保留空间
g G :读取/追加保留空间内容到模式空间
n N :读取/追加下一行到模式空间
p :打印当前模式空间内容
w filename :将模式空间内容另存为filename文件
字符处理:
s/regexp/replacement/ :替换匹配到的行的指定字符串
y/source/dest/ :单字符替换
实例:
-z选项用法: (一) [[email protected] ~]# echo -e "hello fred\nhello" | sed "s:hello:222:" 222 fred 222 [[email protected] ~]# echo -e "hello fred\nhello" | sed -z "s:hello:222:" 222 fred hello (二) [[email protected] ~]# cat t.txt 123 skldfjksladfjsdf 123111111111 [[email protected] ~]# sed "s:123:tttttttttttt:" t.txt tttttttttttt skldfjksladfjsdf tttttttttttt111111111 [[email protected] ~]# sed -z "s:123:tttttttttttt:" t.txt tttttttttttt skldfjksladfjsdf 123111111111
#为每一行行后都添加一行
[[email protected] ~]# cat test.txt 1 23 123456 124356 echo123 [[email protected] ~]# sed ‘a new line‘ test.txt 1 23 new line 123456 new line 124356 new line echo123 new line [[email protected] ~]# sed ‘a \ new line‘ test.txt 1 23 new line 123456 new line 124356 new line echo123 new line
#查找特定行并指定退出码退出
[[email protected] ~]# sed ‘/^123/q4‘ test.txt 1 23 123456 [[email protected] ~]# echo $? 4 [[email protected] ~]# sed ‘/^123/Q18‘ test.txt 1 23 [[email protected] ~]# echo $? 18
#将file的内容追加到test.txt的尾部
[[email protected] ~]# cat > file << eof > this is line1. > eof [[email protected] ~]# sed ‘$rfile‘ test.txt 1 23 123456 124356 echo123 this is line1.
#获取"ip addr show"的输出,并用sed得到IP和掩码
[[email protected] ~]# ip addr show > ipinfo [[email protected] ~]# sed -n ‘/[[:space:]]\+inet /s:[^0-9]*\([0-9.]\+\/[0-9]\+\).*:\1:p‘ ipinfo 127.0.0.1/8 172.18.31.7/16 172.18.252.42/16
#高级用法实例
sed -n ‘n;p‘ FILE #显示偶数行; sed ‘1!G;h;$!d‘ FILE #逆序显示文件的内容; sed ’$!d‘ FILE #取出最后一行; sed ‘$!N;$!D‘ FILE #取出文件后两行; sed ‘/^$/d;G‘ FILE #删除原有的所有空白行,而后为所有的非空白行后添加一个空白行; sed ‘n;d‘ FILE #显示奇数行; sed ‘G‘ FILE #在原有的每行后方添加一个空白行;