草庐IT

Linux sed工具的使用

背对背依靠 2023-03-28 原文

基础知识

- 行编辑工具: 一行一行处理文件内容,例如:sed

- 全屏编辑工具:一次性将文件所有内容加载到内存中,例如:vi、vim、nano

sed编辑器: Stream Editor

工作原理:

逐行处理文件内容,一次读取一行内容到模式空间处理。由此反复,知道最后一行处理完成。

# 处理:可以是输出到屏幕,也可以是文本的修改替换等操作

# 模式空间:就是一块内存空间

sed的基本用法

sed的命令格式

sed [option] 'script' [inputfile]

#script: sed自身的脚本,sed自身语法的一种脚本

#inputfile: 文件,如果不写文件就对标准输入的内容进行处理

sed实现自动打印功能(最基本用法)


sed '' filename

#''里面的脚本内容不能省略
#不输入脚本就是读入什么就默认打印什么 --- sed内置了自动打印的功能

sed选项

-n:关闭sed的自动打印

-e:多点编辑(一次更改多个内容)

-r,-E:使用正则表达式

-i.bak 先把文件做个备份然后再改

-s:将多个文件视为单独的文件

sed的脚本格式

sed脚本:由位置(地址)和指令组合而成

sed脚本的地址格式

- 空地址

- 单地址

- 地址范围

- 步进
空地址:

表示对全文进行处理

单地址:

表示处理指定的行。

#指定的行可以通过数字直接指定,也支持正则表达式匹配。

#写正则表达式的格式:/pattern/
地址范围:

(n,m):表示从n行开始,到m行结束这个范围的内容。

#地址范围也可以使用正则表达式表示: /pat1/,/pat2/ (第一个正则表达式之后到下一个正则表达式中间的内容)

sed脚本的指令

 p --- 内容打印

 Ip --- 忽略大小写输出

 d --- 把模式空间内容删除掉,不再自动打印了

 a --- 再某些行后面加内容

 i --- 再某些行前面加内容

 c --- 替换某一行的内容

 w --- file 另存为指定文件

 r --- 把一个文件内容读到当前匹配到的行中

 = --- 某一行前面添加行号

 ! --- 除了某一行的意思

 q --- 结束或退出sed
 
#搜索替代
s/pattern/string/修饰符 --- 查找替换,支持使用其它分隔符

范例

#sed基本用法:自动打印

#例如:查看某个文件的文本内容
sed '' dir.sh

#打印指定行的内容
sed -n '3p' /etc/passwd #需要使用-n关闭自动打印,因为如果使用了自动打印会输出所有内容,-p:打印匹配到的内容

#打印出包含root的行
sed -n '/root/p' /etc/passwd

#打印从第三行到第六行的内容:
sed -n '3,6p' /etc/passwd

#打印以r开头到以g开头的行的中间那些行 
sed -n '/^r/,/^g/p' /etc/passwd #找到了第一个满足条件的范围后不会停止,还会继续往下面找。

#打印奇数行
sed -n '1~2p' /etc/passwd #从1开始,每次步进2

sed工具的核心用法:搜索替代

#搜索替代的格式:
s/pattern/string/修饰符  #支持使用其它分隔符,可以是其它形式:s@@@,s###

s/模式/替代的字符串/修饰符

搜索替代的修饰符:

g --- 行内全局替换

p --- 显示替换成功的行

w --- /PATH/FILE 将替换成功的行保存至文件中

I,i --- 忽略大小写

# &符号:待变前面搜索出来的内容。 相当于一个变量,保存搜索出来的内容

正则表达式的分组(后项引用)

小括号实现分组,后面要表示第几个分组的内容就用 \num(第几个小括号里面的内容)  #分组实现把一个文件的一行切成多块,保留其中之一

范例

#sed分组的实现 --- 分组使用的是小括号(直接小括号是扩展正则表达式,不加r参数用的是基本正则表达式)

#例如:
echo abc123xyz | sed -r 's/(abc)(123)(xyz)/\1/' #输出abc 值留下了第一个分组

#搜索替换和& --给前面特定的内容后面加内容
sed -nr 's/r..t/&er/gp' /etc/passwd #给搜索到的内容加上er结尾
#获取分区利用率

#获取指定网卡的ip地址:
ifconfig ens33 | sed -nr '2s/.*inet ([0-9.]+) .*/\1/p'
#行首一直到inet 中间空格
#一个以上的数字或点 空格 一直到结尾

ifconfig ens33 | sed -rn '2s/(.*inet )([0-9].*)(netmask.*)/\2/p'
#行首一直到inet,中间空格
#数字
#取基名和目录名
echo "/etc/netplan/01-netcfg" | sed -nr 's#.*\/([^/]+)#\1#p'  #结果为 01-netcfg
#从任意字符开始到以斜杠结尾,然后以非斜杠开头的内容
#使用sed将selinux改为disabled
sed -r -i.bak '/^SELINUX=/s/(SELINUX=).*/\1disabled/' /etc/selinux/config
# 取文件的前缀和后缀
echo a.b.c.tar | sed -nr 's/(.*)\.([^.]+)$/\2/p'
#将非#开头的行加#
sed -rn 's/^[^#]/#&/p' /etc/fstab 
或
#sed -rn 's/^[^#](.*)/#\1/p' /etc/fstab

#将#开头的行删除#
#sed -ri.bak '/^#/s/^#//' /etc/fstab

#删除指定的行
cat /etc/passwd | sed '/tom/d' #删除含有root的行
cat /etc/passwd | sed '4-10d' #删除第四行到第十行的内容

sed编辑器的高级用法

相关概念

模式空间:pattern space,存放sed需要处理哪一行数据(一个缓冲区)

保持空间:Hold Space,临时存放模式空间中的数据(一个临时空间)

两个空间相关的指令

#模式空间内容-->保持空间 小写覆盖,大写追加
h 模式空间的内容覆盖到保持空间
H 模式空间的内容追加到保持空间(内容追加)

#保持空间内容--->模式空间
g 保持空间数据覆盖模式空间
G 保持空间内容追加模式空间

#内容互换
x 两者内容互换

#匹配到的下一行内容--->模式空间
n 匹配行的下一行覆盖至模式空间
N 匹配行的下一行追加至模式空间

#删除
d 清空模式空间
D 删除模式空间第一行

sed命令使用变量

#因为sed的脚本使用单引号括起来的,单引号属于强引用。所见即所得。
#例如:打印含有root的行
name=root
cat /etc/passwd | sed -nr "/$name/p" #如果里面的内容本来就带双引号的,所以就不能再在外面使用双引号。
解决方法;cat /etc/passwd | sed -nr '/'$name'/p' #再加一个单引号把变量括起来 把'/'和'/p'成对了,变量空出来了
#多点编辑并调用变量
#使用变量的方式修改httpd的配置文件 servername和port 
cat /etc/httpd/conf/httpd.conf | sed -nr -e  's/^(Listen) 80/\1 '$port'/p' -re "/#ServerName /c ServerName= `hostname`:$port/p"
#或者:
cat /etc/httpd/conf/httpd.conf | sed -nr -e  's/^(Listen) 80/\1 '$port'/p' -re '/#ServerName /c ServerName= '$(hostname)':'$port'/p' # $(command)
#把包含ServerName的这一行替换成: ServerName: 主机名:端口

范例

#sed实现修改默认的网卡名
 cat /etc/default/grub | sed -nr 's/^(GRUB_CMDLINE_LINUX=.*)"$/\1  net.ifnames=0"/p'
#打印偶数行
seq 10 | sed -n 'n;p' #n:读取到的行的下一行 
#比如首先读取到的是第一行,因为有n,所以就以读到的内容的下一行内容覆盖当前读到的内容到模式空间,所以第一次输出2.

seq 10 | sed -n '2~2p' #使用步进的方式实现

seq 10 | sed -n '1~2!p' #!表示除了这些行,其他的都打印

有关Linux sed工具的使用的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  5. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  6. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  7. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  8. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  9. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  10. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

随机推荐