一、grep
grep----过滤、筛选
grep "字符串"
grep -v "字符串"
grep ^"字符串" 以....开头
grep "字符串"$
grep ^$ 空行
grep -i 不区分大小写
grep -o 只显示匹配的部分
二、sed
sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容发送往屏幕。然后读入下行,执行下一个循环。
如果没有诸如“D”的特殊命令,那会在两个循环之间清空模式空间,但不能清除保留空间。这样不断重复,直到文件末尾。
文件内容并没有改变,除非你使用重定向存储输出或-i。
选项
-n 不打印模式空间
-e 执行脚本、表达式来处理
-f 执行动作从文件读取执行
-i 修改原文件
-r 使用扩展正则表达式
命令
s/regexp/replace/ 替换字符串
p 打印当前模式空间
P(大写) 打印模式空间的第一行
d 删除模式空间,开始下一个循环
D 删除模式空间的第一行,开始下一个循环
= 打印当前行号
a \text 当前行追加文本
i \text 当前行上面插入文本
c \text 所选行替换新文本
q 立即退出sed脚本
r 追加文本来自文件
h H 复制/追加模式空间到保持空间
g G 复制/追加保持空间到模式空间
x 交换模式空间和保持空间内容
l 打印模式空间的行,并显示控制字符$
n N 读取/追加下一行输入到模式空间
w filename 写入到当前模式空间到文件
! 取反、否定
& 引用已匹配字符串
地址
first~step 从first开始,每step步输出值
$ 匹配最后一行
/regexp/ 正则表达式匹配行
number 只匹配指定行
addr1,addr2 开始匹配addr1行开始,直接addr2行结束
addr1,+N 从addr1行开始,向后的N行
addr1,~N 从addr1行开始,到N行结束
案例
[ root@node1 ~ ]
nimgtw 48003 / udp
3gpp- cbsp 48049 / tcp
isnetserv 48128 / tcp
isnetserv 48128 / udp
blp5 48129 / tcp
blp5 48129 / udp
com- bardac- dw 48556 / tcp
com- bardac- dw 48556 / udp
iqobject 48619 / tcp
iqobject 48619 / udp
匹配打印(p)
(1 )打印匹配blp5开头的行
[ root@node1 ~ ]
[ root@node1 ~ ]
blp5 48129 / tcp
blp5 48129 / udp
(2 )打印第一行
[ root@node1 ~ ]
nimgtw 48003 / udp
(3 )打印第一行至第三行
[ root@node1 ~ ]
nimgtw 48003 / udp
3gpp- cbsp 48049 / tcp
isnetserv 48128 / tcp
(4 )打印奇数行
[ root@node1 ~ ]
1
3
5
7
9
(5 )打印匹配行及后一行
[ root@node1 ~ ]
blp5 48129 / tcp
blp5 48129 / udp
(6 )打印最后一行
[ root@node1 ~ ]
iqobject 48619 / udp
(7 )不打印最后一行
[ root@node1 ~ ]
nimgtw 48003 / udp
3gpp- cbsp 48049 / tcp
isnetserv 48128 / tcp
isnetserv 48128 / udp
blp5 48129 / tcp
blp5 48129 / udp
com- bardac- dw 48556 / tcp
com- bardac- dw 48556 / udp
iqobject 48619 / tcp
(8 )匹配范围
[ root@node1 ~ ]
blp5 48129 / tcp
blp5 48129 / udp
com- bardac- dw 48556 / tcp
匹配blp5所在行到最后一行
[ root@node1 ~ ]
blp5 48129 / tcp
blp5 48129 / udp
com- bardac- dw 48556 / tcp
com- bardac- dw 48556 / udp
iqobject 48619 / tcp
iqobject 48619 / udp
(9 )引用系统变量,用引号
[ root@node1 ~ ]
nimgtw 48003 / udp
3gpp- cbsp 48049 / tcp
isnetserv 48128 / tcp
或者
[ root@node1 ~ ]
删除匹配
[ root@node1 ~ ]
nimgtw 48003 / udp
3gpp- cbsp 48049 / tcp
isnetserv 48128 / tcp
isnetserv 48128 / udp
com- bardac- dw 48556 / tcp
com- bardac- dw 48556 / udp
iqobject 48619 / tcp
iqobject 48619 / udp
[ root@node1 ~ ]
3gpp- cbsp 48049 / tcp
isnetserv 48128 / tcp
isnetserv 48128 / udp
blp5 48129 / tcp
blp5 48129 / udp
com- bardac- dw 48556 / tcp
com- bardac- dw 48556 / udp
iqobject 48619 / tcp
iqobject 48619 / udp
[ root@node1 ~ ]
3gpp- cbsp 48049 / tcp
isnetserv 48128 / udp
blp5 48129 / udp
com- bardac- dw 48556 / udp
iqobject 48619 / udp
[ root@node1 ~ ]
isnetserv 48128 / udp
blp5 48129 / tcp
blp5 48129 / udp
com- bardac- dw 48556 / tcp
com- bardac- dw 48556 / udp
iqobject 48619 / tcp
iqobject 48619 / udp
打印时把匹配的打印出来,删除时把匹配的删除,删除只是不用- n选项
练习:去除空格/ etc/ httpd/ conf/ httpd. conf文件的空行或开头
sed '/^#/d;/^$/d' / etc/ httpd/ conf/ httpd. conf
替换(s///)
(1 )替换blp5字符串为test
[ root@node1 ~ ]
nimgtw 48003 / udp
3gpp- cbsp 48049 / tcp
isnetserv 48128 / tcp
isnetserv 48128 / udp
test 48129 / tcp
test 48129 / udp
com- bardac- dw 48556 / tcp
com- bardac- dw 48556 / udp
iqobject 48619 / tcp
iqobject 48619 / udp
全局替换加g
[ root@node1 ~ ]
(2 )替换开头是blp5的字符串并打印
[ root@node1 ~ ]
test 48129 / tcp
test 48129 / udp
(3 )使用& 命令引用匹配内容并替换
[ root@node1 ~ ]
nimgtw 48003 / udp
3gpp- cbsp 48049.123 / tcp
isnetserv 48128 / tcp
isnetserv 48128 / udp
blp5 48129 / tcp
blp5 48129 / udp
com- bardac- dw 48556 / tcp
com- bardac- dw 48556 / udp
iqobject 48619 / tcp
iqobject 48619 / udp
ip加引号
[ root@node1 ~ ]
"10.10.10.1" "10.10.10.2" "10.10.10.3"
(4 )对1 - 5 行的blp5进行替换
[ root@node1 ~ ]
nimgtw 48003 / udp
3gpp- cbsp 48049 / tcp
isnetserv 48128 / tcp
isnetserv 48128 / udp
test 48129 / tcp
blp5 48129 / udp
com- bardac- dw 48556 / tcp
com- bardac- dw 48556 / udp
iqobject 48619 / tcp
iqobject 48619 / udp
(5 )对匹配行进行替换,先匹配出来48129 / tcp所在行,然后再将改行的blp5字符串替换为test
[ root@node1 ~ ]
nimgtw 48003 / udp
3gpp- cbsp 48049 / tcp
isnetserv 48128 / tcp
isnetserv 48128 / udp
test 48129 / tcp
blp5 48129 / udp
com- bardac- dw 48556 / tcp
com- bardac- dw 48556 / udp
iqobject 48619 / tcp
iqobject 48619 / udp
(6 )二次匹配替换
[ root@node1 ~ ]
nimgtw 48003 / udp
4gpp- cbsp 48049 / tcp
isnetserv 48128 / tcp
isnetserv 48128 / udp
test 48129 / tcp
test 48129 / udp
com- bardac- dw 48556 / tcp
com- bardac- dw 48556 / udp
iqobject 48619 / tcp
iqobject 48619 / udp
(7 )分组使用
[ root@node1 ~ ]
nimgtw 48003 / udp test
3gpp- cbsp 48049 / tcp test
isnetserv 48128 / tcp
isnetserv 48128 / udp
blp5 48129 / tcp
blp5 48129 / udp
com- bardac- dw 48556 / tcp
com- bardac- dw 48556 / udp
iqobject 48619 / tcp
iqobject 48619 / udp
(8 )将协议与端口号位置互换
[ root@node1 ~ ]
nimgtw udp/ 48003
3gpp- cbsp tcp/ 48049
isnetserv tcp/ 48128
isnetserv udp/ 48128
blp5 tcp/ 48129
blp5 udp/ 48129
com- bardac- dw tcp/ 48556
com- bardac- dw udp/ 48556
iqobject tcp/ 48619
iqobject udp/ 48619
(9 )位置调换
[ root@node1 ~ ]
abc cde Xyz
[ root@node1 ~ ]
abc cde xxyXz
[ root@node1 ~ ]
abc cde xxYxz
将cde和456 互换位置
[ root@node1 ~ ]
abc: 456 ; 123 : cde
(10 )注释匹配行后的多少行
[ root@node1 ~ ]
1
2
3
4
9
10
(11 )注释指定多行
[ root@node1 ~ ]
1
2
5
[ root@node1 ~ ]
1
2
5
案例4 :多重编辑
删除1 - 4 行,并将剩余行的blp5替换为test
[ root@node1 ~ ]
test 48129 / tcp
test 48129 / udp
com- bardac- dw 48556 / tcp
com- bardac- dw 48556 / udp
iqobject 48619 / tcp
iqobject 48619 / udp
或
[ root@node1 ~ ]
test 48129 / tcp
test 48129 / udp
com- bardac- dw 48556 / tcp
com- bardac- dw 48556 / udp
iqobject 48619 / tcp
iqobject 48619 / udp
添加新内容(a、i、c)
(1 )在blp5上一行添加test
[ root@node1 ~ ]
nimgtw 48003 / udp
3gpp- cbsp 48049 / tcp
isnetserv 48128 / tcp
isnetserv 48128 / udp
test
blp5 48129 / tcp
test
blp5 48129 / udp
com- bardac- dw 48556 / tcp
com- bardac- dw 48556 / udp
iqobject 48619 / tcp
iqobject 48619 / udp
[ root@node1 ~ ]
(2 )在blp5下一行添加test
[ root@node1 ~ ]
nimgtw 48003 / udp
3gpp- cbsp 48049 / tcp
isnetserv 48128 / tcp
isnetserv 48128 / udp
blp5 48129 / tcp
test
blp5 48129 / udp
test
com- bardac- dw 48556 / tcp
com- bardac- dw 48556 / udp
iqobject 48619 / tcp
iqobject 48619 / udp
(3 )将blp5所在行替换为新行test
[ root@node1 ~ ]
nimgtw 48003 / udp
3gpp- cbsp 48049 / tcp
isnetserv 48128 / tcp
isnetserv 48128 / udp
test
test
com- bardac- dw 48556 / tcp
com- bardac- dw 48556 / udp
iqobject 48619 / tcp
iqobject 48619 / udp
(4 )在指定行的下一行添加一行
[ root@node1 ~ ]
nimgtw 48003 / udp
3gpp- cbsp 48049 / tcp
test
isnetserv 48128 / tcp
isnetserv 48128 / udp
blp5 48129 / tcp
blp5 48129 / udp
com- bardac- dw 48556 / tcp
com- bardac- dw 48556 / udp
iqobject 48619 / tcp
iqobject 48619 / udp
(5 )在指定行前面和后面添加一行
[ root@node1 ~ ]
1
2
txt
3
4
5
[ root@node1 ~ ]
1
2
3
test
4
5
案例6 :读取文件并追加到匹配行后(r)
[ root@node1 ~ ]
123
456
[ root@node1 ~ ]
nimgtw 48003 / udp
3gpp- cbsp 48049 / tcp
isnetserv 48128 / tcp
isnetserv 48128 / udp
blp5 48129 / tcp
123
456
blp5 48129 / udp
123
456
com- bardac- dw 48556 / tcp
com- bardac- dw 48556 / udp
iqobject 48619 / tcp
iqobject 48619 / udp
将匹配行写到文件(w)
[ root@node1 ~ ]
nimgtw 48003 / udp
3gpp- cbsp 48049 / tcp
isnetserv 48128 / tcp
isnetserv 48128 / udp
blp5 48129 / tcp
blp5 48129 / udp
com- bardac- dw 48556 / tcp
com- bardac- dw 48556 / udp
iqobject 48619 / tcp
iqobject 48619 / udp
[ root@node1 ~ ]
blp5 48129 / tcp
blp5 48129 / udp
读取下一行(n和N)
n 读取下一行到模式空间。
N 追加下一行内容到模式空间,并以换行符\n 分隔。
(1 )打印匹配的下一行
[ root@node1 ~ ]
4
(2 )打印偶数
[ root@node1 ~ ]
2
4
6
sed 先读取第一行 1 ,执行 n 命令,获取下一行 2 ,此时模式空间是 2 ,执行 p 命令,打印模式空
间。 现在模式空间是 2 ,sed 再读取 3 ,执行 n 命令,获取下一行 4 ,此时模式空间为 4 ,执行 p 命
令,以此类推。
(3 )打印奇数
[ root@node1 ~ ]
1
3
5
读取1 ,执行n,得出2 ,执行d,删除2 ,得空,以此类推,读取3 ,执行n,得出4 ,
执行d,删除4 ,得空,但是读取5 时,得出6 ,执行d,删除6 。
因无- n参数,故输出1 \n3\n5
[ root@node1 ~ ]
1
3
5
(4 )每三行执行一次p命令
[ root@node1 ~ ]
1
2
3
3
4
5
6
6
sed 先读取第一行 1 ,并打印模式空间 1 ,执行 n 命令,获取下一行 2 ,并打印模式空间 2 ,再执行 n
命令,获取下一行 3 ,执行 p 命令,打印模式空间 3 。sed 读取下一行 3 ,并打印模式空间 3 , 以此类
推。
(5 )每三行替换一次
方法1 :只是把p命令改成了替换命令
[ root@node1 ~ ]
1
2
= 3 =
4
5
= 6 =
方法2 :这次用到了地址匹配,来实现上面的效果
[ root@node1 ~ ]
1
2
= 3 =
4
5
= 6 =
当执行多个 sed 命令时,有时相互会产生影响,我们可以用大括号{ } 把他们括起来
(6 )再看下N命令的功能
[ root@node1 ~ ]
1
2
将两行合并一行:
[ root@node1 ~ ]
12
34
56
第一个命令:sed 读取第一行 1 ,N 命令读取下一行 2 ,并以\n2 追加,此时模式空间是 1 \n2,再执
行 q 退出。
为了进一步说明 N 的功能,看第二个命令:执行 N 命令后,此时模式空间是 1 \n2,再执行把\n 替换
为空,此时模式空间是 12 ,并打印。
[ root@node1 ~ ]
1
2
3
4
[ root@node1 ~ ]
1
2
3
4
5
6
为什么第一个不打印 5 呢?
因为 N 命令是读取下一行追加到 sed 读取的当前行,当 N 读取下一行没有内容时,则退出,也不会
执行 p 命令打印当前行。
当行数为偶数时,N 始终就能读到下一行,所以也会执行 p 命令。
[ root@node1 ~ ]
1
2
3
4
5
加一个满足条件,当 sed 执行到最后一行时,用感叹号不去执行 N 命令,随后执行 p 命令
案例9 :打印和删除模式空间第一行(P(大写)和D)
P(大写) 打印模式空间的第一行。
D 删除模式空间的第一行。
(1 )打印奇数
[ root@node1 ~ ]
1
3
5
[ root@node1 ~ ]
6
读取第一行 1 ,执行 N 命令读取下一行并追加到模式空间,此时模式空间是 1 \n2,执行 D 命令删除
模式空间第一行 1 ,剩余 2 。
读取1 ,执行N,得出1 \n2,执行D,得出2 ,执行N,得出2 \n3,执行D,得出3 ,依此类推,得出6 ,
执行N,条件失败退出,因无- n参数,故输出6
案例10 :保持空间操作(h与H,g与G和x)
h 复制模式空间内容到保持空间(覆盖)。
H 复制模式空间内容追加到保持空间。
g 复制保持空间内容到模式空间(覆盖)。
G 复制保持空间内容追加到模式空间。
x 模式空间与保持空间内容互换
(1 )将匹配的内容覆盖到另一个匹配
[ root@node1 ~ ]
1
2
4
3
6
h 命令把匹配的 3 复制到保持空间,d 命令删除模式空间的 3 。后面命令再对模式空间匹配 5 ,并用
g 命令把保持空间 3 覆盖模式空间 5 。
(2 )将匹配的内容放到最后
[ root@node1 ~ ]
1
2
4
5
6
3
(3 )交换模式空间和保持空间
[ root@node1 ~ ]
1
2
4
3
6
5
在模式空间匹配 5 并将保持空间的 3 与 5 交换,5 就变成了 3 , 。最后把保持空间的 5
追加到模式空间的。
三、awk
awk 是一个处理文本的编程语言工具,能用简短的程序处理标准输入或文件、数据排序、计算以及
生成报表等等。
awk 处理的工作方式与数据库类似,支持对记录和字段处理,这也是 grep 和 sed 不能实现的。
在 awk 中,缺省的情况下将文本文件中的一行视为一个记录,逐行放到内存中处理,而将一行中的
某一部分作为记录中的一个字段。用 1,2,3...数字的方式顺序的表示行(记录)中的不同字段。用
$后跟数字,引用对应的字段,以逗号分隔,0 表示整个行。
1、选项:
-f 从文件中读取awk程序源文件
-F 指定fs为输入字段分隔符
-v 变量赋值
--posix 兼容posix正则表达式
--dump-variables=[file] 把awk命令时的全局变量写入文件,默认文件是awkvars.out
--profile=[file] 格式化awk语句到文件,默认是awkprof.out
2、模式
常用模式有:
BEGIN{ } 给程序赋予初始状态,先执行的工作
END{ } 程序结束之后执行的一些扫尾工作
/regular expression/ 为每个输入记录匹配正则表达式
pattern && pattern 逻辑and,满足两个模式
pattern || pattern 逻辑or,满足其中一个模式
!pattern 逻辑not,不满足模式
pattern1,pattern2 范围模式,匹配所有模式1的记录,直到匹配到模式2
示例
1、从文件读取awk程序处理文件
[ root@node1 ~ ]
{ print $2 }
[ root@node1 ~ ]
48003 / udp
48049 / tcp
48128 / tcp
48128 / udp
48129 / tcp
48129 / udp
48556 / tcp
48556 / udp
48619 / tcp
48619 / udp
2、指定分隔符,打印指定字段
[ root@node1 ~ ]
root
bin
daemon
adm
lp
. . . . . . .
还可以指定多个分隔符,作为同一个分隔符处理:
[ root@node1 ~ ]
com- bardac- dw
iqobject
iqobject
[ root@node1 ~ ]
com- bardac- dw 48556
iqobject 48619
iqobject 48619
[ root@node1 ~ ]
udp
tcp
udp
[ root@node1 ~ ]
48556
48619
48619
[ ] 元字符的意思是符号其中任意一个字符,也就是说每遇到一个/ 或
分隔符时,就能更方面处理字段了
3、变量赋值
[ root@node1 ~ ]
123
系统变量作为awk变量的值
[ root@node1 ~ ]
[ root@node1 ~ ]
123
或使用单引号
[ root@node1 ~ ]
123
[ root@node1 ~ ]
4、输出 awk 全局变量到文件
[ root@node1 ~ ]
1
2
3
4
5
[ root@node1 ~ ]
ARGC: 1
ARGIND: 0
ARGV: array, 1 elements
BINMODE: 0
CONVFMT: "%.6g"
ENVIRON: array, 29 elements
ERRNO: ""
FIELDWIDTHS: ""
FILENAME: "-"
FNR: 5
FPAT: "[^[:space:]]+"
FS: " "
FUNCTAB: array, 41 elements
IGNORECASE: 0
LINT: 0
NF: 1
NR: 5
OFMT: "%.6g"
OFS: " "
ORS: "\n"
PREC: 53
PROCINFO: array, 20 elements
RLENGTH: 0
ROUNDMODE: "N"
RS: "\n"
RSTART: 0
RT: "\n"
SUBSEP: "\034"
SYMTAB: array, 28 elements
TEXTDOMAIN: "messages"
[ root@node1 ~ ]
5、BEGIIN和END
BEGIN 模式是在处理文件之前执行该操作,常用于修改内置变量、变量赋值和打印输出的页眉或标题。
例如:打印页眉
[ root@node1 ~ ]
Service Port Description
== =
nimgtw 48003 / udp
3gpp- cbsp 48049 / tcp
isnetserv 48128 / tcp
isnetserv 48128 / udp
blp5 48129 / tcp
blp5 48129 / udp
com- bardac- dw 48556 / tcp
com- bardac- dw 48556 / udp
iqobject 48619 / tcp
iqobject 48619 / udp
END 模式是在程序处理完才会执行。
例如:打印页尾
[ root@node1 ~ ]
nimgtw 48003 / udp
3gpp- cbsp 48049 / tcp
isnetserv 48128 / tcp
isnetserv 48128 / udp
blp5 48129 / tcp
blp5 48129 / udp
com- bardac- dw 48556 / tcp
com- bardac- dw 48556 / udp
iqobject 48619 / tcp
iqobject 48619 / udp
== =
END. . . . . .
6、格式化输出awk命令到文件
[ root@node1 ~ ]
Service Port Description
== =
nimgtw 48003 / udp
3gpp- cbsp 48049 / tcp
isnetserv 48128 / tcp
isnetserv 48128 / udp
blp5 48129 / tcp
blp5 48129 / udp
com- bardac- dw 48556 / tcp
com- bardac- dw 48556 / udp
iqobject 48619 / tcp
iqobject 48619 / udp
== =
END. . . . . .
[ root@node1 ~ ]
BEGIN {
print "Service\t\tPort\t\t\tDescription\n==="
}
{
print $0
}
END {
print "===\nEND......"
}
7、/re/正则匹配
匹配包含 tcp 的行:
[ root@node1 ~ ]
3gpp- cbsp 48049 / tcp
isnetserv 48128 / tcp
blp5 48129 / tcp
com- bardac- dw 48556 / tcp
iqobject 48619 / tcp
8、逻辑 and、or 和 not
匹配记录中包含 blp5 和 tcp 的行:
[ root@node1 ~ ]
blp5 48129 / tcp
匹配记录中包含 blp5 或 tcp 的行:
[ root@node1 ~ ]
3gpp- cbsp 48049 / tcp
isnetserv 48128 / tcp
blp5 48129 / tcp
blp5 48129 / udp
com- bardac- dw 48556 / tcp
iqobject 48619 / tcp
不匹配开头是
[ root@node1 ~ ]
或者
[ root@node1 ~ ]
9、匹配范围
[ root@node1 ~ ]
blp5 48129 / tcp
blp5 48129 / udp
com- bardac- dw 48556 / tcp