Linux sed和awk

sed

strem editor 流编辑器

sed 编辑器是一行一行的处理文件内容的。正在处理的内容存放在模式空间(缓冲区)内,处理完成后按照选项的规定进行输出或文件的修改。

sed主要用来自动编辑一个或多个文件;简化文件的反复操作;非交互式编译文件

语法:

sed 【options】 ‘【command】’ 【filename】

options:

-n  抑制自动(默认的)输出 读取下一个输入行,-n要读取的行号

-e  执行多个sed命令

-f  运行脚本

-i  编辑文件内容

-i.bak  编辑的同时创造.bak的备份

-r  使用扩展的正则表达式

command

a  在匹配后追加

i  在匹配后插入

p  打印

d  删除

r/R  读取文件/一行

w  另存

s  查找

c  替换

y  替换

h/H   复制拷贝/追加模式空间(缓冲区)到存放空间

g/G   粘贴 从存放空间取回/追加到模式空间

x  两个空间内容的交换

n/N  拷贝/追加下一行内容到当前

D  删除\n之前的内容

P  打印\n之前的内容

b  无条件跳转

t  满足匹配后的跳转

T  不满足匹配时跳转

显示文件第三行的内容

[root@zq ~]# sed -n 3p /etc/passwd    对第三行进行操作 p打印出
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@zq ~]# sed -n '1,3p' /etc/passwd   显示1-3行的内容
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@zq ~]# sed -n '1,3!p' /etc/passwd    加感叹号就是除了1-3显示其他所有内容
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
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
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
systemd-network:x:998:996:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:997:995:User for polkitd:/:/sbin/nologin

显示第三行和之后的三行

[root@zq ~]# sed -n '3,+3p' /etc/passwd
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

在文件的头插入“###”,在文件尾插入“@@@”,把文件第三行替换成“$$$”

[root@zq ~]# sed '1i###' /etc/passwd
###
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologi   这个改完之后是不保存的 ,原文件还是老样子
[root@zq ~]# sed '1i###' /etc/passwd > a.txt   重定向
[root@zq ~]# sed '1i###' /etc/passwd >> a.txt   追加
[root@zq ~]# head a.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
[root@zq ~]# sed '$a@@@' /etc/passwd >> a.txt  在文件尾部追加@@@   $代表尾部a代表追加
[root@zq ~]# tail a.txt 
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
gnome-initial-setup:x:989:984::/run/gnome-initial-setup/:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
zq:x:1000:1000:zq:/home/zq:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
@@@
[root@zq ~]# sed '3c$$$' /etc/passwd   第三行插入$$$
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
$$$

awk

AWK是一种优良的文本处理工具,linux及Unix环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言的最大功能取决于一个人所拥有的知识。awk命名:Alfred Aho Peter Weinberger和brian kemighan三个人的姓的缩写。

最简单地说,AWK是一种用于处理文本的编程语言工具。任何awk语句都是由模式和动作组成,一个awk脚本可以有多个语句。模式决定动作语句的触发条件和触发时间。

特殊字段:

BEGIN语句设置计数和打印头部信息,在任何动作之前进行。

END语句输出统计结果,在完成动作之后执行。

分隔符默认是空格,可以用-F,改变成逗号为分隔符-F,或改成冒号-F

eg:准备要显示的内容

vim result.txt

aa 7 17 27 37 47 57
bb 8 18 28 38 48 58
cc 9 19 29 39 49 59
dd 6 16 26 36 46 56
[root@zq ~]# awk "{print $0}" result.txt     双引号怎么不行,大神如果看到请给一下意见




[root@zq ~]# awk '{print $0}' result.txt     $0显示所有内容 
aa 7 17 27 37 47 57
bb 8 18 28 38 48 58
cc 9 19 29 39 49 59
dd 6 16 26 36 46 56
[root@zq ~]# awk '{print $1}' result.txt     $1显示内容的第一列
aa
bb
cc
dd

显示/etc/passwd第一列,以:作为分隔符

[root@zq ~]# awk -F: '{print $1}' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator

显示第一列和第三列内容

[root@zq ~]# awk '{print $1,$3}' result.txt 
aa 17
bb 18
cc 19
dd 16                    有点儿python取列表字典里面元素的意思
[root@zq ~]# awk 'BEGIN {print "name level result\n"} {print $1,$2,$3} END{ print "end of class1 results"}' result.txt 
name level result

aa 7 17
bb 8 18
cc 9 19
dd 6 16
end of class1 results    这更有点儿python嵌套的意思了,也不是给取的值 取个名字,也不是嵌套就是给要取的值赋了个名字
[root@zq ~]# awk '$2 >= 7 {print $0}' result.txt   快跟sql python 连上了
aa 7 17 27 37 47 57
bb 8 18 28 38 48 58
cc 9 19 29 39 49 59
[root@zq ~]# awk '{ if($1 == "aa" || $2=="8") print $0 }' result.txt 
aa 7 17 27 37 47 57
bb 8 18 28 38 48 58   无处不在的if  或