linux之sed命令
一、sed的常用功能
1、处理文本文件
2、分析日志文件
3、修改配置文件//
二、sed的原则
1、sed一次处理一行内容
2、sed不改变文件内容,除非重定向或-i参数
3、sed可以对所有行进行操作,也可以根据正则选择选定行
三、sed的格式
1、命令行模式
sed [options] 'command' file
options:-e,-n,-i
command:行定位(正则)+sed命令(操作)
2、脚本格式
sed -f scriptfile file
3、常见的命令
p命令:输出命令 ,打印命令
sed 'p' passwd 打印内容两行
sed -n 'p' passwd -n忽略默认输出,解决上述问题
行定位:
nl命令
nl passwd | sed -n '10p' 忽略空白行不显示行号
nl -b a passwd | sed -n '10p' 不忽略空白行,假如第十行是空白,也会输出空白行的行号10
nl -b a passwd | sed -n '6,10p' 6到10行
正则
sed -n '/besttest/p' passwd 定位到 besttesth这行
nl -b a passwd | sed -n '/mail/,/besttest/p' 从mail到besttest这一行
nl -b a passwd | sed -n '16,/besttest/p' 从16行到besttest这一行
除去这几行
nl -b a passwd | sed -n '16!p' 不要16这一行
nl -b a passwd | sed -n '6,10!p' 不要6到10这几行
间隔几行
nl -b a passwd | sed -n '1~2p' 数字一代表从第1行开始,2代表每隔两行打印一次。
4、基本操作命令
a 新增行 在行后
nl -b a passwd | sed '12a=======' 12行后面
nl -b a passwd | sed '1,5a=======' 在1到5行后面都增加,多行情况
i 插入行 在行前
nl -b a passwd | sed '12i========' 12行前面
c 替换行
nl -b a passwd | sed '5c=======' 第5行替换为========
nl -b a passwd | sed '2,5c=======' 第2到5行都替换为========
d 删除行
nl -b a passwd | sed '2d' 删除第2行
nl -b a pawwwd | sed '1,5d' 删除第1到5行,多行情况
s 替换
sed 's/old/new/' profile 把old替换为new 以/为分隔符
sed 's/:/%/g' profile 这里g是全局替换的意思,文件中的:都替换为%
#案例:获取eth0中的ip地址
ifconfig | sed -n '/inet.*Bcast/p' | sed 's/ine.*r:/ /' | sed 's/\sBcast:.*/ /'
几种方法
#案例,修改配置文件 在/etc/profile中添加环境变量
如何定位最后一行
sed '$a\ export TOMCAT_HOME=XXXX\n export PATH=$PATH:$TOMCAT_HOME' profile
使用\来家空格符
sed命令,默认不修改源文件,两种修改的方法:
@重定向
sed '$a\ export TOMCAT_HOME=XXXX\n export PATH=$PATH:$TOMCAT_HOME' profile >> profile 此时追加了profile文件的内容,输出了两次
如何解决,加-n
sed -n '$a\ export TOMCAT_HOME=XXXX\n export PATH=$PATH:$TOMCAT_HOME' profile >> profile
@加-i 参数
sed -i '$a\ export TOMCAT_HOME=XXXX\n export PATH=$PATH:$TOMCAT_HOME' profile
#案例 删除配置文件里的空白行
sed '/^$/d' file
#案例 服务器中日志处理-服务器log中打印error信息
sed -n '/error/p' file
#多个sed命令用{}括起来,命令之间用;隔开。
nl passwd | sed '{10,20d;s/false/true/}'
#n 读取下一个输入行(用下一个命令处理)
nl -b a passwd | sed -n '{n;p;}' >>前一行不取,取第二行>> nl -b a passwd | sed -n '{2~2p}'
nl -b a passwd | sed -n '{n;n;p;}' >>前两行不取,取第三行>>nl -b a passwd | sed -n '{3~3p}' 都可以用步进实现
#& 替换固定的字符串
配合替换操作使用
将passwd中的用户名后面添加空格
sed 's/^[a-z_-]\+/& ' passwd
#对用户名的首字母转换为大写
\u \l:对首字母转大写或小写
\U \L :对一串字符大写或小写
sed 's/^[a-z_-]\+/\u& ' passwd
#将所有的 txt文件名转化为大写
ls | sed 's/.*/\U&/'
#()
\( \):括号需要转义,
替换某种部分字符串(\1,\2)
sed 's/w1\(w2\)\(w3\)/\1\2/' 匹配前两个正则表达式的内容 输入w2w3
获取eth0的ip
ifconfig 本机 | sed -n '/inet .*Bca/p' | sed 's/inet.*r:\([0-9.]\+\).\+Bcast.*$/\1/'
#获取passwd 中的用户名 uid 和gid
sed 's/\(^[a-z_-]\+\):x:\([0-9]\+\):.*$ /\1,\3/'
#r:读取指定文件插入到匹配行
sed '1r 123.txt' abc.txt 把123.txt里的数据插入到abc.txt里的第一行之后
读不会更改文件内容
#w:复制匹配行拷贝指定文件
sed '1w 123.txt' abc.txt 复制abc.txt的内容到123.txt的第一行之后
写操作会修改目标文件
#q 退出sed,使用q可以提前退出sed
nl passwd | sed '10q'
#-e:可以执行多次sed命令
nl -b a passwd | sed -e '10,20d' -e 's/:/%/'
#-i:可以修改文件的内容
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步