首页 文章 精选 留言 我的

精选列表

搜索[linux],共10000篇文章
优秀的个人博客,低调大师

Linux基础之sed流编辑器详解

之前介绍了三大文本编辑器的grep,这里介绍比grep功能更强的sed流编辑器 sed是什么? sed是Stream EDitor的缩写,man中对sed的简介为 sed - stream editor for filtering and transforming text 它的主要功能是对文本的过滤与替换。 sed的工作原理 sed的工作过程:sed是一个流编辑器,所谓流编辑器是指sed每次只从文件或stdin中读入一行,将读入的行保存至模式空间然后根据指定的要求对其进行处理,并将处理后的结果输出至屏幕,接着读入下一行,整个文本的过程如流水线般被逐行处理后输出。 sed对内容的处理方式:sed不是在原文件中或原输入上直接进行处理的,它将读入的行放入缓存区,对缓存区里的内容进行处理,处理完毕后默认不会写入或覆盖源文件,而是直接输出到屏幕上。 它有两个内存缓冲区分别叫做:模式空间(pattern space)、保持空间也有称作暂存缓存区(holding space)。 一般情况下sed首先把第一行装入模式空间,进行处理后输出屏幕,然后第二行装入模式空间替换掉模式空间里原来的内容,再进行处理,依次循环,直至结束。 下面是我对sed工作流程的理解图。 1、sed每次将stdin中的内容中的一行读入模式空间 2、之后根据模式空间中的匹配条件进行匹配,符合条件进入下一阶段即普通编辑,不满足则默认至标准输出,结束 3、普通编辑之后分三个阶段,1)普通编辑之后选择性显示至STDOUT,结束;2)进入holding space进行高级编辑,编辑结束后选择性显示至模式空间,之后再次根据编辑命令重复2-3过程;3)若是出现多编辑命令则需要再返回模式空间根据编辑条件再次进行2-3步骤。 限于个人理解程度上述的理解免不了跟真实的工作流程有些出入,大家要抱着质疑的态度去看,我写的不一定都是对的,不过错的应该不至于很多。 sed语法 sed OPTIONS... <SCRIPT>[INPUTFILE...] [SCRIPT]:可以理解为地址定界加编辑命令。 常用选项: -n:不输出模式空间中的内容至屏幕;通俗点可以理解为它可以自动过滤掉模式空间中未匹配到的行,-n 要与命令编辑中的p合用(命令编辑见下文),用于显示模式空间中被匹配到的内容。 suppress automatic printing of pattern space -n的具体应用见后面的sed编辑高级命令演示 -e:多点编辑 add the script to the commands to be executed -f:每行一个编辑命令 add the contents of script-file to the commands to be executed -r:使用扩展表达式 use extended regular expressions in the script. -i:直接编辑原文件 edit files in place (makes backup if SUFFIX supplied) SCRIPT: 之前对这块很迷糊,因为info中sed显示语法有[]表示可加可不加,于是就在sed后直接加想要编辑的文本 于是就出现如下情况 [root@localhosttest]#sedsed1 sed:-e表达式#1,字符4:未终止的“s”命令 报错信息没找到终止的限制条件,所以上面的sed语法格式并不准确。 通过实验,sed可以不加[OPTION]但是[SCRIPT]则必须添加 SCRIPT分两部分:地址定界(用于限定编辑文本的范围)、编辑命令(用于对匹配到的内容进行什么样的操作或编辑),前者可少后者必不可少,如果没有编辑的命令会发生如下错误 [root@localhosttest]#sed'1'cat1 sed:-e表达式#1,字符1:遗漏命令 [root@localhosttest]#catcat1 hi,everyone nowIwillshowhowtousecat [root@localhosttest]#sed'p'cat1 hi,everyone hi,everyone nowIwillshowhowtousecat nowIwillshowhowtousecat 地址定界: 1、空地址:对全文处理。 2、单地址: #:指定行; /pattern/:被此模式所匹配到的每一行; 3、地址范围: #,#:从#开始到#结束的所有行 #,+#:从#开始向下至+#的行之间的所有行 #,/pat1/ 从#开始至匹配到第一次出现/pat1/模式的行之间的所有行 /pat1/,/pat2/:第一次匹配到/pat1/的行到第一次匹配到/pat2/的行之间的所有行 4、步进:~ 1~2:所有奇数行 2~2:所有偶数行 编辑命令:若少了编辑命令会报错,编辑命令在SCRIPT中至少出现一次。 d:删除模式空间中匹配到的内容 Delete pattern space a \text 在行后面插入文本“text”,支持使用\n实现多行插入 Append text, which has each embedded newline preceded by a back slash. i \text 在行前面插入文本“text”,支持使用\n实现多行插入 Insert text, which has each embedded newline preceded by a back slash. c\text 把匹配到的行替换为此处指定的文本“text” Replace the selected lines with text, which has each embedded new line preceded by a backslash. w filename 保存模式空间匹配的行至指定的文件中 Write the current pattern space to filename. r filename 读取指定文件内容至当前文件被模式匹配到的行文件后合并 Append text read from filename. = : 为模式匹配到的行打印行号 Print the current line number. !: 条件取反(它比较特殊,它必须跟其他编辑命令一起使用) s/regexp/replacement/ : 查找替换,其分隔符可自行指定,常用有s@@@,s### 它有一个特殊的用法s//x&/:表示将被查找的内容在其前面添加x内容 s//&x/:表示将被查找的内容在其后面添加x内容 &代表被查找的内容 [root@localhosttest]#catcat1 hi,everyone nowIwillshowhowtousecat [root@localhosttest]#sed's/e/&#/'cat1 hi,e#veryone nowIwillshowhowtouse#cat [root@localhosttest]#sed's/e/#&/'cat1 hi,#everyone nowIwillshowhowtous#ecat p :显示替换成功的行 g :全局替换 w filename : 将替换成功的结果保存至指定文件中 查找替换在sed中应用很广,下面很多例子都是以sed的替换功能实现的 p :显示当前模式空间中的内容 Print the current pattern space. 注:同时使用多个编辑命令,命令之间要用;隔开(!除外) 例子如下: [root@localhosttest]#sed'p;='cat1 hi,everyone 1 hi,everyone nowIwillshowhowtousecat 2 nowIwillshowhowtousecat 实例演示: 1、删除/etc/grub2.conf文件中所有以空白开头的行行首的空白字符 sed's#^[[:space:]]\+##'/etc/grub2.cfg 这里##是将前面匹配到的内容删除的意思,上面文本内容太多,就不截取了。 2、删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#号及#后面的所有空白字符 sed's@^#[[:space:]]\+@@'/etc/fstab [root@localhosttest]#cat/etc/fstab # #/etc/fstab #CreatedbyanacondaonTueJul1923:52:412016 # #Accessiblefilesystems,byreference,aremaintainedunder'/dev/disk' #Seemanpagesfstab(5),findfs(8),mount(8)and/orblkid(8)formoreinfo # /dev/mapper/centos-root/xfsdefaults00 UUID=6efb8a23-bae1-427c-ab10-3caca95250b1/bootxfsdefaults00 /dev/mapper/centos-swapswapswapdefaults00 [root@localhosttest]#sed's@^#[[:space:]]\+@@'/etc/fstab # /etc/fstab CreatedbyanacondaonTueJul1923:52:412016 # Accessiblefilesystems,byreference,aremaintainedunder'/dev/disk' Seemanpagesfstab(5),findfs(8),mount(8)and/orblkid(8)formoreinfo # /dev/mapper/centos-root/xfsdefaults00 UUID=6efb8a23-bae1-427c-ab10-3caca95250b1/bootxfsdefaults00 /dev/mapper/centos-swapswapswapdefaults00 3、在/etc/fstab每一行行首增加#号 cat/etc/fstab # #/etc/fstab #CreatedbyanacondaonTueJul1923:52:412016 # #Accessiblefilesystems,byreference,aremaintainedunder'/dev/disk' #Seemanpagesfstab(5),findfs(8),mount(8)and/orblkid(8)formoreinfo # /dev/mapper/centos-root/xfsdefaults00 UUID=6efb8a23-bae1-427c-ab10-3caca95250b1/bootxfsdefaults00 /dev/mapper/centos-swapswapswapdefaults00 sed's@^@#&@'/etc/fstab # ## ##/etc/fstab ##CreatedbyanacondaonTueJul1923:52:412016 ## ##Accessiblefilesystems,byreference,aremaintainedunder'/dev/disk' ##Seemanpagesfstab(5),findfs(8),mount(8)and/orblkid(8)formoreinfo ## #/dev/mapper/centos-root/xfsdefaults00 #UUID=6efb8a23-bae1-427c-ab10-3caca95250b1/bootxfsdefaults00 #/dev/mapper/centos-swapswapswapdefaults00 4、处理/etc/fstab路径,使用sed命令取出其目录名和基名 目录名: [root@localhosttest]#echo'/etc/fstab'|sed-r's#(.*/)([^/]+/?)#\1#' /etc/ 基名: [root@localhosttest]#echo'/etc/fstab'|sed-r's#(.*/)([^/]+/?)#\2#' fstab sed高级编辑命令: h:把模式空间中的内容覆盖至保持空间中; H:把模式空间中的内容追加至保持空间中; g:把保持空间中的内容覆盖至模式空间中; G:把保持空间中的内容追加至模式空间中; x:把模式空间中的内容与保持空间中的内容互换; n:覆盖读取匹配到的行的下一行至模式空间中; N:追加读取匹配到的行的下一行至模式空间中; d:删除模式空间中的行; D:删除多行模式空间中的所有行; 我知道看了上面这些高级命令一定很晕,下面通过5个例子来理一下使用sed高级编辑命令的思路 高级编辑命令实例演示: 1、 sed -n 'n;p' FILE: ''内意思:将读取到的行的下一行内容显示至模式空间 -n 'p':将模式空间中被匹配到的内容显示至屏幕 二者结合起来就是只显示偶数行。 [root@localhosttest]#cat-ncat1 1hi,everyone 2nowIwillshowhowtousecat [root@localhosttest]#sed-n'n;p'cat1 nowIwillshowhowtousecat 2、 sed '1!G;h;$!d' FILE: 这个命令按'x;x;x'中的;号分割分为三部分: 1、1!G:除读取的第一行都进行G编辑 2、h:将模式空间中的内容覆盖至保持空间中 3、$!d:删除非最后一行的内容 命令解释完了,我想大家对此应该还是一头雾水,那么就具体说明这个命令的意思: 1)读取文本信息的1行内容至模式空间,由于是第一行所以模式空间中的1行不进行G操作,之后触发h,将模式空间中的1行放入保持空间中,再之后触发$!d,由于1行不是最后一行,所以将模式空间中的1行删除; 2)读取2行内容至模式空间,由于不是1行所以触发G操作,将保持空间中1行追加到2行后面,此时模式空间中的顺序内容为2行,1行,之后h命令将模式空间中内容覆盖至保持空间中,此时保持空间内容为2行,1行,因为2行不是最后一行,所以$!d删除模式空间中内容; 3)上述过程不断重复,直到最后一行时不进行d操作,此时模式空间中的第一行就是原文件的最后一行。 因此这个命令就是原文件内容反过来的排列。 [root@localhosttest]#catcat1 hi,everyone nowIwillshowhowtousecat [root@localhosttest]#sed'1!G;h;$!d'cat1 nowIwillshowhowtousecat hi,everyone 3、 sed '$!d' FILE: 经过了上面两个命令的磨练,这个就显得简单了。 '$!d':不是最后一行则删除 意思是说模式空间中只保留文本的最后一行 [root@localhosttest]#sed'$!d'cat1 nowIwillshowhowtousecat 4、 sed '/^$/d;G' FILE '/^$/d':查找模式空间中的每行是否包含空白行,若包含则将其删除 G:将保持空间中的内容追加至模式空间中的每行后面 删除原有的所有空白行,而后为所有的非空白行后添加一个空白行; 二者结合在一起即:保证指定文件每一行后方有且只有一个空白行 [root@localhosttest]#sed'/^$/d;G'cat1 hi,everyone nowIwillshowhowtousecat 5、 sed 'n;d' FILE:显示奇数行; 这个就很简单了,大家按照sed的工作原理及编辑命令n与d很容易就能明白其所表达的意思 [root@localhosttest]#catcat1 hi,everyone nowIwillshowhowtousecat [root@localhosttest]#sed'n;d'cat1 hi,everyone 学习sed的一些感受 学习sed如果对于sed的编辑命令或高级命令很困惑,那么不妨试试照着我上面的sed工作流程图,一步一步的自己画图分析每一步所代表的意思。这既能加强自己对sed这个工具的了解也可有助于理清我们的使用思路。这是我在学习过程中觉得很有用的一种方法。 sed这个工具它的精髓在于它的替换,替换的精髓在于精确匹配,而精确匹配又离不开正则表达式的,所以如果觉得自己对于替换很不擅长的话那么可以好好练习一下正则表达式。 sed是一个实用性很强的文本编辑工具,由于能力所限,也只能对sed进行下简要的介绍,大家若对其有进一步的兴趣可以查找更专业的书籍。

优秀的个人博客,低调大师

Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理》——2.8 开机启动时间设置

2.8 开机启动时间设置 开机启动时间是大部分与时间相关的计算的基础。操作系统中一些程序的运算需要时间参数;很多事务的处理也都要用到时间,比如文件修改的时间、文件最近访问的时间、i节点自身的修改时间等。有了开机启动时间,其他时间就可据此推算出来。具体执行步骤是:CMOS是主板上的一个小存储芯片,系统通过调用time_init()函数,先对它上面记录的时间数据进行采集,提取不同等级的时间要素,比如秒(time.tm_sec)、分(time.tm_min)、年(time.tm_year)等,然后对这些要素进行整合,并最终得出开机启动时间(startup_time)。执行代码如下: //代码路径:init/main.c: void main(void) { … time_init(); … } #define CM

优秀的个人博客,低调大师

Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理》——3.3 轮转到进程1执行

3.3 轮转到进程1执行 在分析进程1如何开始执行之前,先回顾一下进程0创建进程1的过程。在3.1.3节中讲解调用copy_process函数时曾强调过,当时为进程1设置的tss.eip就是进程0调用fork( )创建进程1时int 0x80中断导致的CPU硬件自动压栈的ss、esp、eflags、cs、eip中的EIP值,这个值指向的是int 0x80的下一行代码的位置,即if (__res >= 0)。前面讲述的ljmp 通过CPU的任务门机制自动将进程1的TSS的值恢复给CPU,自然也将其中的tss.eip恢复给CPU。现在CPU中的EIP指向的就是fork中的if (__res >= 0)这一行,所以,进程1就要从这一行开始执行。执行代码如下: //代码路径:include/unistd.h: #define _s

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册