前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Shell笔记5:sed用法详解

Shell笔记5:sed用法详解

作者头像
陪你听风
发布2021-03-31 23:39:26
1.2K0
发布2021-03-31 23:39:26
举报
文章被收录于专栏:陪你听风陪你听风

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,${n,p}' 输出第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 '/^$/{n;/^$/d}' 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 “:” ‘{print $1,$2}’ /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 '{print 第“FNR”行,有“NF”列}' /etc/passwd

awk -F ":" '{print "LAST:"$NF}' /etc/passwd

awk -F ":" 'BEGIN{print "User\tUID\tHome"}{print $1"\t"$3"\t"$6}END{print NR}' /etc/passwd

2.awk处理条件

awk 选项 ‘条件{编辑指令}’ 文件

条件的表现形式:正则 数值比较 逻辑运算 运算符

awk -F: '$3>=0&&$3<2{print $1,$3}' /etc/passwd

变量运算

awk ‘NR%2==0{print}’ /etc/passwd 输出偶数行文本

awk 'BEGIN{i=0}{i+=NR}END{print i}' /etc/passwd

awk -F: '$3>=1&&$3<=50{print $0}' /etc/passwd

awk -F: '/^svr/||/^wwww/{print}' /etc/hosts

awk -F: ‘/^[a-d]/{print $1,$6}’ /etc/passwd

awk -F: '/^a|nologin$/{print $1,$7}' /etc/passwd

awk -F: '$6~/bin$/{print $1,$6}' /etc/passwd 对第6个字段做~匹配

awk -F: ‘$7!~/nologin$/{print $1,$7}’ /etc/passwd

awk -F: 'NR==3{print}' /etc/passwd 第三行

awk -F:‘NR%2==1{print}’ /etc/passwd 奇数行

awk -F: ‘NR<=3{print}’ /etc/passwd 前三行

awk -F: ‘NR>=5{print}’ /etc/passwd 第5行至结尾

awk -F: ‘$1=="sync"{print}’ /etc/passwd 用户名为sync的行

awk -F:‘$1==ENVIRON["USER"]{print $1,$6,$7}’ /etc/passwd

逻辑测试条件

awk -F: 'NR>=3&&NR<=5{print}' /etc/passwd

awk -F: 'NR==3||NR==5{print}' /etc/passwd

awk -F: '$7!~/nologin$/||$1~/^[a-d]/{print}' /etc/passwd

awk -F: '$3<3||$3%2==0{print}' /etc/passwd

数学运算

awk -F: 'BEGIN{x=0}{x+=NF}END{print x}' /etc/passwd

awk -F: '/^127|^192/{print}' /etc/hosts

seq 100 |awk 'NR%7==0||NR~/7/{print}' 7的倍数或者包含7的数字

脚本示例:提取用户名和密码字段存储

#!/bin/bash

> /tmp/getupwd.log

awk -F: '/\/bin\/bash$/{print $1}' /etc/passwd >/tmp/users.tmp

for NAME in $(cat /tmp/users.tmp)

do

grep "^$NAME:" /etc/shadow|awk -F: '{print $1"-->"$2|cat >>/tmp/getupwd.log }'/etc/shadow

done

echo 'over'

3.awk流程控制

分支结构:统计UID小于或等于500的用户个数,统计UID大于500的用户个数

awk -F: 'BEGIN{i=0;j=0}{if($3<=500){i++}else{j++}}END{print i,j}' /etc/passwd

循坏结构:while循坏 while(条件){编辑指令}

do while循环do{编辑指令}while(条件)

for循环:

for(初值;条件;步长){编辑指令}

cat sshd.txt |awk '{for(i=1;i<=NF;i++){print $i}}'

统计/etc/passwd中root出现的次数

awk -F[:/] 'BEGIN{j=0}{i=1}{while(i<=NF){if($i~/root/){j++};i++}}END{print j}' /etc/passwd

echo $(cat /etc/passwd)|awk -F "root" '{print NF-1}'

awk 'BEGIN{for(i=1;i<=10;i++){print i}}'

awk 'BEGIN{for(i=1;i<=20;i++){if(i%3==0){print i}}}'

awk 'BEGIN{for(i=1;i<=100;i++){sum+=i;if(i==100){print sum}}}'

提取/etc/passwd文件的第7列,存为a1.txt,去重保存在a2.txt

基本用法awk '!a[$0]++' filename

a为数组名 $0为处理对象 表示要去除的是整行重复的内容,如果要去除的是字段重复的行,可以将$0改为$1 $2

提取测试文件:awk -F: '{print $7}' /etc/passwd >a1.txt

awk '!a[$0]++' a1.txt >a2.txt

统计web访问量排名

awk '{ip[$1]++}END{for(i in ip){print i,ip[i]}}' /var/log/www.log |sort -nrk 2

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年8月22日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档