Linux sed和awk
Posted rumenzq
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 不满足匹配时跳转
显示文件第三行的内容
[[email protected] ~]# sed -n 3p /etc/passwd 对第三行进行操作 p打印出 daemon:x:2:2:daemon:/sbin:/sbin/nologin [[email protected] ~]# 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 [[email protected] ~]# 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
显示第三行和之后的三行
[[email protected] ~]# 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
在文件的头插入“###”,在文件尾插入“@@@”,把文件第三行替换成“$$$”
[[email protected] ~]# 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 这个改完之后是不保存的 ,原文件还是老样子
[[email protected] ~]# sed ‘1i###‘ /etc/passwd > a.txt 重定向 [[email protected] ~]# sed ‘1i###‘ /etc/passwd >> a.txt 追加 [[email protected] ~]# 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
[[email protected] ~]# sed ‘[email protected]@@‘ /etc/passwd >> a.txt 在文件尾部追加@@@ $代表尾部a代表追加 [[email protected] ~]# 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 @@@
[[email protected] ~]# 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
[[email protected] ~]# awk "{print $0}" result.txt 双引号怎么不行,大神如果看到请给一下意见 [[email protected] ~]# 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 [[email protected] ~]# awk ‘{print $1}‘ result.txt $1显示内容的第一列 aa bb cc dd
显示/etc/passwd第一列,以:作为分隔符
[[email protected] ~]# awk -F: ‘{print $1}‘ /etc/passwd root bin daemon adm lp sync shutdown halt mail operator
显示第一列和第三列内容
[[email protected] ~]# awk ‘{print $1,$3}‘ result.txt aa 17 bb 18 cc 19 dd 16 有点儿python取列表字典里面元素的意思
[[email protected] ~]# 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嵌套的意思了,也不是给取的值 取个名字,也不是嵌套就是给要取的值赋了个名字
[[email protected] ~]# 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
[[email protected] ~]# 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 或
以上是关于Linux sed和awk的主要内容,如果未能解决你的问题,请参考以下文章