Shell笔记5:sed的用法详解

文章在小程序中同步发布,点击访问小程序。

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

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180823G0B51600?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券