文章在小程序中同步发布,点击访问小程序。
1.sed基本用法
a.sed命令解析
概述:sed是流式编辑器,非交互式的基于模式匹配过滤及修改文本,可实现对文本的输出删除复制替换剪切等各种操作
命令格式解析:
格式1:前置命令 |sed 选项 ‘编辑指令’
格式2:sed 选项 ‘编辑指令’ 文件
例:sed -n ‘/^id/p’ /etc/inittab 列出以id开头的行
常见的命令选项
-n:屏蔽默认输出(全部文本)
-i:直接修改文件内容
-f:使用sed脚本
-e:可以指定多个处理动作
-r:启用扩展的正则表达式,当与其他选项使用时应作为首个选项
-{}:可组合多个命令,以分号分割
定址符:用来指定处理的起止行,省略定址符时默认逐行处理全部文本,地址可以表示为文本的行号,或者匹配的正则表达式
sed -n '2,4p' /etc/hosts
基本的处理动作
p 打印 2,4p 2p;4p
d 删除 2,4d 删除第234行
s 字符串替换
s/old/new/将每行的第一个old替换为new
s/old/new/3将每行的第三个old替换为new
s/old/new/g 将所有的old替换为new
替换操作的分割符/可改为其他字符,如# $等,便于修改文件路径
b.常见的操作示例
输出文本
sed -n ‘p’ a.txt 输出所有行
sed -n '4p' a.txt 输出第4行
sed -n '4,7p' a.txt 输出4-7行
sed -n '4,+10p' a.txt 输出第4行及其后的10行内容
sed -n ‘/^bin/p’ a.txt 输出以bin开头的行
sed -n ‘p;n’ a.txt 输出奇数行
sed -n ‘n;p’ a.txt 输出偶数行
sed -n '10,$' 输出第10行到结尾的所有偶数行
sed -n ‘$=’ 输出文件的行数
删除文本
sed '3,5d' a.txt删除第3-5行
sed ‘/xml/d’ a.txt删除所有包含xml的行
sed ‘/xml/!d’ a.txt 删除所有不包含xml的行
sed '/^install/d' a.txt 删除所有以
sed '$d' a.txt删除最后一行
sed '/^$/d' a.txt删除所有空行
sed '/^$/' a.txt 删除重复空行
以上所有动作需要加 -i
替换文本
sed ‘s/xml/XML/’ a.txt 将每行的第一个xml替换为XML
sed 's/xml/XML/3' a.txt 将每行的第3个xml替换为XML
sed 's/xml/XML/g' a.txt 将所有的xml替换为XML
sed ‘s/xml//g’ a.txt 将所有的xml都删除
sed 's/doc/$docs'/g a.txt 将所有的doc替换为docs $代表查找串
sed ‘4,7s/^/#/’ a.txt 第四行-7 注释掉
sed ‘s/^#an/an’ a.txt 以#an开头的行的注释去掉
删除每行第二个和最后一个字符 sed -i 's/.//2;s/.$//' a.txt
删除每行第二个和最后一个单词 sed -r 's/[a-Z]+//2;s/[a-Z]+([^a-Z]*)$/\1/' a.txt
将文件中每行的第一个和第二个字符互换 sed -r 's/^(.)(.)(.*)/\2\1\3/' a.txt
将文件中每行的第一个和第二个单词互换 sed -r 's/([a-Z]+)([^a-Z]*)([a-Z]+)(.*)/\3\2\1\4/' a.txt
删除所有的数字和行首的空格sed -r ‘s/[0-9]//g;s/^( )+//’ a.txt
为每个大写字母添加括号 sed -r s/[A-Z]/(&)/g a.txt
2.sed应用案例
a.修改系统的默认运行级别
sed -i '/^id:/s/5/3/' /etc/inittab
修改IP地址:将配置文件中的192.168.1.X修改为172.16.0.X
sed -ri '/^IPADDR/s/192.168.1.(.*)/172.16.0.\1/' /etc/sysconfig/network-scripts/ifcfg-eth0
修改网站根目录:将/var/www/html修改为/opt/wwwroot
sed -ri 's#/var/www/html#/opt/wwwroot#' /etc/httpd/conf/httpd.conf
3.sed脚本
复杂操作可存为脚本,通过 -f调用
sed -f 操作脚本 文件
vim /root/test.sed
s/pang/&jing/
s/[0-9]//g
sed -f test.sed a.txt
4.sed文本块的处理
sed文本块处理动作
i 行前插入文本:2iYY 在第二行之前插入文本行‘YY’
4,7iYY 在第4-7行的每一行前添加文本
a 行后插入文本:2aYY 在第2行之后添加文本
/^XX/aYY 在以XX开头的行之后添加文本
c 替换当前行:2cYY 将第2行的内容修改为YY
sed ‘2iXX’ m.txt
sed ‘2aXX’ m.txt
sed '2cXX' m.txt
处理多行文本:修改后的文本有多行时,以换行符\n分割,或者使用\强制换行
sed -n '2cXX\nYY' m.txt
sed -n '2cXX\nYY
YY' m.txt
利用sed配置主机名:找到HOSTNAME行替换整行即可
sed -i '/^HOSTNAME/cHOSTNAME=newhostname' /etc/sysconfig/network
修改host文件,添加两条映射记录
sed -i '1a192.168.4.5 svr5.web.com svr5' /etc/hosts
sed -i '1a123.125.99.124 www.baidu.com' /etc/hosts
5.sed高级应用
文件导入导出
r:读取文件 3r b.txt 在第3行下方插入文本b.txt
4,7r b.txt 在第4-7行每一行后插入文件b.txt
w:保存到文件 3w c.txt 将第3行另存为文件c.txt
4,7w c.txt 将第4-7行另存为文件c.txt
sed '2r m.txt' reg.txt
sed '/^abc/r m.txt' reg.txt
sed -n '1,2w c.txt' reg.txt
sed -n '/^XX/w d.txt' reg.txt
sed流控制
!取反操作:根据定址条件取反
sed -n '/bash$/!p' /etc/passwd
n读下一行,读取下一行进行处理
sed -n 'p;n' reg.txt 读取奇数行
sed -n 'n;p' red.txt 读取偶数行
sed综合脚本示例
根据/etc/passwd提出密码串
day06
1.awk基本用法
命令格式解析:
格式1:前置命令 | awk 选项 ‘条件’
格式2:awk 选项 ‘条件 文件’
awk -F “:” ‘’ /etc/passwd
常用命令选项:
-F:指定分隔符,可省略 默认为空格或Tab位
-f:调用awk脚本进行处理
-v:调用外部shell命令
awk内置变量,有特殊含义,可直接使用
FS:保存或设置字段分隔符,例如FS=“:”
$n:指定分割的第n个字段,如$1,$3分别表示第1,第3列
$0:当前读入的整行文本内容
NF:记录当前处理行的字段个数,列数
NR:记录当前已读入行的数量,行数
FNR:保存当前处理行在原文本内的序号,行号
FILENAME:当前处理的文件名
ENVIRON:调用Shell环境变量,格式 ENVIRON["变量名"]
awk '' /etc/passwd
awk -F ":" '' /etc/passwd
awk -F ":" 'BEGINEND' /etc/passwd
2.awk处理条件
awk 选项 ‘条件’ 文件
条件的表现形式:正则 数值比较 逻辑运算 运算符
awk -F: '$3>=0&&$3
变量运算
awk ‘NR%2==0’ /etc/passwd 输出偶数行文本
awk 'BEGINEND' /etc/passwd
awk -F: '$3>=1&&$3
awk -F: '/^svr/||/^wwww/' /etc/hosts
awk -F: ‘/^[a-d]/’ /etc/passwd
awk -F: '/^a|nologin$/' /etc/passwd
awk -F: '$6~/bin$/' /etc/passwd 对第6个字段做~匹配
awk -F: ‘$7!~/nologin$/’ /etc/passwd
awk -F: 'NR==3' /etc/passwd 第三行
awk -F:‘NR%2==1’ /etc/passwd 奇数行
awk -F: ‘NR
awk -F: ‘NR>=5’ /etc/passwd 第5行至结尾
awk -F: ‘$1=="sync"’ /etc/passwd 用户名为sync的行
awk -F:‘$1==ENVIRON["USER"]’ /etc/passwd
逻辑测试条件
awk -F: 'NR>=3&&NR
awk -F: 'NR==3||NR==5' /etc/passwd
awk -F: '$7!~/nologin$/||$1~/^[a-d]/' /etc/passwd
awk -F: '$3
数学运算
awk -F: 'BEGINEND' /etc/passwd
awk -F: '/^127|^192/' /etc/hosts
seq 100 |awk 'NR%7==0||NR~/7/' 7的倍数或者包含7的数字
脚本示例:提取用户名和密码字段存储
#!/bin/bash
> /tmp/getupwd.log
awk -F: '/\/bin\/bash$/' /etc/passwd >/tmp/users.tmp
for NAME in $(cat /tmp/users.tmp)
do
grep "^$NAME:" /etc/shadow|awk -F: ''/etc/shadow
done
echo 'over'
3.awk流程控制
分支结构:统计UID小于或等于500的用户个数,统计UID大于500的用户个数
awk -F: 'BEGINelse}END' /etc/passwd
循坏结构:while循坏 while(条件)
do while循环dowhile(条件)
for循环:
for(初值;条件;步长)
cat sshd.txt |awk '}'
统计/etc/passwd中root出现的次数
awk -F[:/] 'BEGIN;i++}}END' /etc/passwd
echo $(cat /etc/passwd)|awk -F "root" ''
awk 'BEGIN}'
awk 'BEGIN}}'
awk 'BEGIN}}'
提取/etc/passwd文件的第7列,存为a1.txt,去重保存在a2.txt
基本用法awk '!a[$0]++' filename
a为数组名 $0为处理对象 表示要去除的是整行重复的内容,如果要去除的是字段重复的行,可以将$0改为$1 $2
提取测试文件:awk -F: '' /etc/passwd >a1.txt
awk '!a[$0]++' a1.txt >a2.txt
统计web访问量排名
awk 'END}' /var/log/www.log |sort -nrk 2
领取专属 10元无门槛券
私享最新 技术干货