示例:
sed [options] 'command' file(s)
sed [options] -f scriptfile(你可以把 sed 理解为一种简单的语言只不过这种语言 仅仅只对文件做编辑 脚本由sed 命令组成) file(s)
[root@wrh-50 ~]# head -n 6 passwd |tail -n 2
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
[root@wrh-50 ~]# sed -n '5,6p' passwd #p:(与 d 命令一样 前面都要给定址范围的)
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
sed -n '/\:/p' fstab
# Created by anaconda on Sun Sep 24 20:13:27 2017
sed -n '/UUID$/p' fstab #匹配以UUID结尾的行
sed -n '/^UUID/p' fstab #匹配以UUID开头的行
sed -n '2,6!p' fstab #!符号:匹配不在指定行号范围内的行
d:
sed ‘/^UUID/d’ /etc/fstab
sed ‘/^#/d’ /etc/fstab
sed ‘/^$/d’/etc/fstab (删除所有空白行 一开始就结束了)
sed ‘1,4d’/etc/fstab (d 命令可以和地址定界一起使用)
sed –n ‘/^UUID/!d’ /etc/fstab (对地址定界取反 除了 UUID 开头的行都删除)
a:
sed ‘/^UUID/a \hello sed /etc/fstab’ (追加到每一行符合条件的行后面)
sed ‘/^UUID/a \hello sed\nwestos /etc/fstab’(支持多行追加)
i:
sed ‘/^UUID/i\hello sed\nwestos /etc/fstab’ (追加在符合条件的行前面)
c:
sed ‘/^UUID/c\hello sed\nwestos /etc/fstab’ (替换符合条件的单行或多行文本)
w:
sed ‘/^UUID/w /tmp/fstab.txt’ /etc/fstab (把/etc/fstab 中UUID 开头的行保存到/tmp/fstab 中)
sed -n‘/^UUID/w /tmp/fstab.txt’ /etc/fstab
sed ‘/^UUID/=’/etc/fstab (打印行号)
sed ‘6r /etc/issue’ /etc/fstab (把/etc/issue 文件内容放置到/etc/fstab 中的第六行)
sed ‘s/oot/OOT/’ /etc/fstab (把/etc/fstab 中的 oot 变成大写的 OOT)
sed ‘s/^\//#/’/etc/fstab (把行首的/换成#)
sed ‘s@^/@#@g’/etc/fstab (如果不想用转义字符的话 可以换转义字符啦~)
sed ‘s/\//#/’/etc/fstab (默认动作只替换第一次被模式匹配到的串)
sed ‘s/\//#/g/’/etc/fstab
awk '{print $1,$3}' /etc/passwd (发现与 cat /etc/passwd所输出的内容一样 因为 passwd 这个文件的每一行里面,就没有空格符号阿 )
awk -F: '{print $1,$2}' passwd #显示当前目录下的passwd文件 第一段和第二段 以:隔开 输出时默认空格分割
awk -F: '{print $1","$2}' passwd #显示当前目录下的passwd文件 第一段和第二段 以:隔开 输出时以,分割
awk -F "in" '{print $1, $3}' /etc/passwd
awk -F [:/] '{print $1, $10}' /etc/passwd (awk 还识别多种单个的字符串,比如“:或者/分隔,输出第 1,10 个字段
测试文件: head -n 7 /etc/passwd > passwd.txt
awk '{print FILENAME,NR}' passwd.txt (使用 awk 输出当前操作的文件名,当前处理的行号)
awk -F: '{print NR,NF}' passwd.txt (输出每次处理的行号,以及当前行以:,分隔的字段个数)
awk '{print "第"NR"行","有"NF"列"}' passwd.txt
//预处理时,行数为 0
//全部处理完以后,行数为已读入文本行数
输出本机的 IP 地址:
ifconfig br0 | grep 'inet ' | awk '{print $2}' #br0方式
输出本机的根分区使用率:
df -hT / | tail -1 | awk '{print $6}'
-h(或者 human) :以可读性较高的方式来显示
-T :显示文件系统的类型
输出第三行的用户记录: awk -F: 'NR==3{print}' passwd.txt
输出奇数(行号 NR 除以 2 余数为 1)行的用户记录: awk -F: 'NR%2==1{print}'passwd.txt
输出偶数(行号除以 2 余数为 0)行的用户记录: awk -F: 'NR%2==0{print}' passwd.txt
输出前三行文本: awk -F: 'NR<=3{print}' passwd.txt
输出从第五行开始到文件末尾的所有行: awk -F: 'NR<=5{print}' passwd.txt
输出用户名为‘sync’的行: awk -F: '$1=="sync"{print}' passwd.txt
条件设置多个条件的组合示例:
1 && 2 : 1 执行完成(成功)接着执行 2
1 || 2:1 执行完成(不成功)接着执行 2
awk –F:’$3>=0&&3<2{print $1,$3}’/etc/passwd (列出 UID 小于2 的用户信息)
awk –F ‘$3==1||$3==7{print $1,$3}’/etc/passwd (列出 UID 为1 或者 7 的用户信息)
逻辑测试小练习:
测试文件 passwd.txt
输出第 3~5 行文本 : awk -F: 'NR>=3&&NR<=5{print}' passwd.txt
输出第 3 行和第五行文本: awk -F: 'NR==3&&NR==5{print}' passwd.txt
输出 UID 小于 3 或者 UID 是偶数的用户记录:awk -F: '$3<3||$3%2==0{print}' passwd.txt
条件设置变量的数学算示例:
awk -F: '$3>=1&&$3<=4{print}' /etc/passwd (列出 UID 间于 1~的用户详细信息)
awk ‘BEGIN{i=0}{i+=NF}END{print i}’linux.txt (统计文本的总字段个数)
seq 200|awk 'BEGIN{i=0}$(0%3==0)&& \> ($0%13==0){i++}END{print i}' (计算能同时被 3 和 13 整除的整数个数
awk 数学运算练习题:
输出/etc/hosts 影射文件内以 127 或者 129 开头的记录:
a wk -F: '/^127|^192/{print}' /etc/hosts列出 100 以内整数中 7 的倍数或者是含 7 的数(用 awk 来实现 )
此操作无处理文件,正常思路应该是用 shell 循环来完成;因为要求用 awk 来实现,如果不用循化,则根据逐行处理的思路,应该提供一个 100 行的文本对象,
然后将行号作为处理的整数,逐个判断并输出即可
利用 seq 命令可生成 1-100 的整数序列:seq 100
结合管道交给 awk 处理,,那么根据可简化实现步骤。针对本题,行号与每行的
实际文本值是一致的 NR 或者$0 行值进行判断都是可以的:
seq 100 | awk 'NR%7==0||NR~/7/{print}'
seq 100 | awk '$0%7==0||$0~/7/{print}'
awk 流程控制 if 分支结构:
单分支:统计/etc/passwd 文件中 UID 小于或者等于 500 的用户个数“
awk -F: 'BEGIN{i=0}{if($3<=500){i++}}END{print i}' /etc/passwd
统计/etc/passwd 文件中 UID 大于 500 的用户个数:
awk -F: 'BEGIN{i=0}{if($3>500){i++}}END{print i}' /etc/passwd
统计/etc/passwd 文件中登陆 shell 是/bin/bash 的用户个数
awk -F: 'BEGIN{i=0}{if($7~/bash$/){i++}}END{print i}' /etc/passwd
统计/etc/passwd 文件中登陆 shell 不是/bin/bash 的用户个数
awk -F: 'BEGIN{i=0}{if($7!~/bash$/){i++}}END{print i}' /etc/passwd
While 循环示例:
统计/etc/passwd 文件内 root 出现的次数
awk -F [:\] \
> 'BEGIN{j=0} \
> {i=1}{while(i<=NF){if($i~/root/){j++};i++}} \
> END{print j}' /etc/passwd
(示例分析:以:或者/做分隔,针对每一行的每一列进行比对,如
果包含 root 则次数加 1 其中:逐行处理直接由 awk 完成,逐列处理交
给 while 循环,通过 i 变量依次取$1,$2...$NF 进行检查;变量 j 在预处
理时赋值 0,每匹配一个子段加 1)
for 示例:awk 'BEGIN{for(i=1;i<5;i++){print i}}'
END