sed命令的正则表达式实践

1. 取系统ip

[[email protected] logs]# ifconfig eth3
eth3      Link encap:Ethernet  HWaddr 08:00:27:4C:6F:AD
          inet addr:192.168.0.109  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:18603 errors:0 dropped:0 overruns:0 frame:0
          TX packets:7782 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:2652530 (2.5 MiB)  TX bytes:1664897 (1.5 MiB)

解答:

方法1:sed ‘s#支持正则##g‘ file

# 第一步:取到ip所在的行,取第二行
[[email protected] /]# ifconfig eth3|sed -n ‘2p‘
          inet addr:192.168.0.109  Bcast:192.168.0.255  Mask:255.255.255.0

# 第二步:取中间的内容,先将前面的一段匹配掉,替换掉
[[email protected] /]# ifconfig eth3|sed -n ‘2p‘|sed ‘s#inet addr:##g‘
          192.168.0.109  Bcast:192.168.0.255  Mask:255.255.255.0
# 取内容时,必须要在这行内容中是唯一的,不是唯一的,默认会取到最后一个
[[email protected] /]# ifconfig eth3|sed -n ‘2p‘|sed ‘s#^.*:##g‘
255.255.255.0

# 将 以任意字符开头的,长度0-N个的,以dr: 为结尾的内容替换掉
[[email protected] /]# ifconfig eth3|sed -n ‘2p‘|sed ‘s#^.*dr:##g‘
192.168.0.109  Bcast:192.168.0.255  Mask:255.255.255.0

# 第三步:将要取的ip内容的后端从开头取替换掉
[[email protected] /]# ifconfig eth3|sed -n ‘2p‘|sed ‘s#^.*dr:##g‘|sed ‘s#  B.*$##g‘
192.168.0.109

处理技巧:

  1. 匹配需要的目标(获取的字符串,如本例中的ip)前的字符串一般用以...开头(^.*)来匹配开头,匹配的结尾写上实际的字符。

    • 如:"^.*addr:" 表达式就匹配" inet addr:"
  2. 而处理需要的目标后的内容,一般在匹配的开头写上实际的字符,而结尾是用以...结尾(.*$)来匹配。
    • 如:"Bcast:.*$"部分匹配表示"Bcast:10.0.0.255 Mask:255.255.255.0"

方法2:

  • 替换命令:sed -n ‘s#支持正则位置##gp‘ file
  • 指定行号:s前的2为 行号
    • sed -n ‘2s#支持正则位置##gp‘ file
[[email protected] /]# ifconfig eth3|sed -n ‘2s#^.*dr:##gp‘
192.168.0.109  Bcast:192.168.0.255  Mask:255.255.255.0

[root@oldboy /]# ifconfig eth3|sed -n ‘2s#^.*dr:##gp‘|sed -n ‘s#  Bc.*$##gp‘
192.168.0.109

方法3:sed的后向引用 sed -nr ‘s#()()#\1\2#gp‘ file

测试和说明:

[[email protected] /]# cat a.txt
I am oldboy Linux.

# 取任意字符开头,取任意字符一直到m;然后()内容是要输出的内容,任意字符;后面是以"L"开头的任意字符(N个)结尾。
# 替换掉 () 外面的内容,输出()内的内容
[[email protected] /]# sed -nr ‘s#^.*m (.*) L.*$#\1#gp‘ a.txt
oldboy

当正则匹配部分使用(),第一个括号,可以在后面的部分用“\1”来输出;第二个括号的内容,可以用"\2"来输出。

获取ip的方法:

# 取第二行,开头任意字符,是...r:()  Bc...,输出 () 的内容。
[[email protected] /]# ifconfig eth3|sed -nr ‘2s#^.*r:(.*)  Bc.*$#\1#gp‘
192.168.0.109

# 第二行都不取,条件定义好,直接就能输出结果
[[email protected] /]# ifconfig eth3|sed -nr ‘s#^.*r:(.*)  Bc.*$#\1#gp‘
192.168.0.109

方法4: 用awk,grep等文本处理方式分列获取,sed命令是用于学习的

[[email protected] test]# ifconfig eth3|awk -F "[ :]+" ‘NR==2 {print $4}‘
192.168.0.109

[root@oldboy test]# grep IPADDR /etc/sysconfig/network-scripts/ifcfg-eth3|cut -d "=" -f 2
192.168.0.109

sed 方法替换的扩展练习:

1. 将下面文件的内容用sed替换方法取出 644:

[[email protected] /]# stat /etc/hosts
  File: `/etc/hosts‘
  Size: 158             Blocks: 8          IO Block: 4096   regular file
Device: 803h/2051d      Inode: 259614      Links: 2
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2019-10-01 00:00:08.875025775 +0800
Modify: 2010-01-12 21:28:22.000000000 +0800
Change: 2019-08-30 08:12:59.831999996 +0800

答案:

[[email protected] /]# stat /etc/hosts|sed -nr ‘s#^.*: \(0(.*)/-rw.*$#\1#gp‘
644

2. 将下面文件内容的第一列和最后一列做个对调

[[email protected] /]# tail /etc/passwd
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
oldboy:x:500:500::/home/oldboy:/bin/bash
zoe:x:501:501::/home/zoe:/bin/bash
apache:x:48:48:Apache:/var/www:/sbin/nologin
beaty:x:502:502::/home/beaty:/bin/bash

答案:

正则表达式1:()()()三块分别借助单个匹配的特征,输出再拼接

[[email protected] /]# tail /etc/passwd|sed -nr ‘s#(.*):x(.*):(.*)#\3:x\2:\1#gp‘
/sbin/nologin:x:68:68:HAL daemon:/:haldaemon
/sbin/nologin:x:38:38::/etc/ntp:ntp
/sbin/nologin:x:499:76:Saslauthd user:/var/empty/saslauth:saslauth
/sbin/nologin:x:89:89::/var/spool/postfix:postfix
/sbin/nologin:x:74:74:Privilege-separated SSH:/var/empty/sshd:sshd
/sbin/nologin:x:72:72::/:tcpdump
/bin/bash:x:500:500::/home/oldboy:oldboy
/bin/bash:x:501:501::/home/zoe:zoe
/sbin/nologin:x:48:48:Apache:/var/www:apache
/bin/bash:x:502:502::/home/beaty:beaty

正则表达式2:()()()三组分别匹配上内容

[[email protected] /]# sed -nr ‘s#([^:]+)(:.*:)(/.*$)#\3\2\1#gp‘ /etc/passwd
/bin/bash:x:0:0:root:/root:root
/sbin/nologin:x:1:1:bin:/bin:bin
/sbin/nologin:x:2:2:daemon:/sbin:daemon
...
/bin/bash:x:501:501::/home/zoe:zoe
/sbin/nologin:x:48:48:Apache:/var/www:apache
/bin/bash:x:502:502::/home/beaty:beaty

原文地址:https://www.cnblogs.com/zoe233/p/11920446.html

时间: 2024-07-31 19:16:12

sed命令的正则表达式实践的相关文章

sed命令和正则表达式

sed命令和正则表达式 sed是一种在线的,非交互式的编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,成为模式空间,接着用sed命令处理缓冲区的内容.处理完,把缓冲区的内容送往屏幕.sed支持正则表达式与grep一样,sed在文件中查找模式时也可以使用正则表达式(RE)和各种元字符.正则表达式是括在斜杠间的模式,>用于查找和替换,以下是sed支持的元字符使用基本元字符集 ^ $ [] [^] \<\> () {} 使用扩展元字符 ?+ {} | () sed命令:

十二、sed 命令与正则表达式

awk 命令 截取文档中的某段 #awk -F ':' {print$1} 1.txt    打印第一段 #awk  -F ':' 'OFS='#' {print$1,$2,$3,$4} 1.txt 指定显示结果的分隔符为#  , 也可以使用自定义字符连接每个段 {print$1"#"$2} 匹配字符或字符串 #awk '/root/' 1.txt 针对某个段匹配 #awk -F ':' $1 ~/oo/' 1.txt 多次匹配 #awk -F ':' /root/ {print $1

Linux shell 命令和正则表达式

今天在Fedora20系统上编译VPP项目时遇到了一个问题,在最终编译并且使用rpmbuild生成的rpm安装包不正确,我们需要对生成rpm包的spec文件做一些小的修改. 首先我们来看看VPP自带的生成rpm包的spec描述文件,该文件为${VPP_TOPDIR}/build-root/rpm/vpp.spec, 我们可以打开看看该文件的内容: 其中在%install 段里面有如下的命令 1 # 2 # libraries  3 #  4 mkdir -p -m755 %{buildroot}

玩转LINUX之sed命令详解

Linux sed命令是利用script来处理文本文件. sed可依照script的指令,来处理.编辑文本文件. Sed主要用来自动编辑一个或多个文件:简化对文件的反复操作:编写转换程序等. 执行时,sed会从文件或者标准输入中读取一行,将其复制到缓冲区,对文本编辑完成之后,读取下一行直到所有的文本行都编辑完毕. 所以sed命令处理时只会改变缓冲区中文本的副本,如果想要直接编辑原文件,可以使用-i选项或者将结果重定向到新的文件中. sed命令的基本语法如下: # sed [options] co

centos 7中的文本处理工具sed命令的使用

sed是一个强大而简答的文本解析转换工具,可以读取文本,并根据指定的条件对文本内容进行编辑(删除.替换.添加.移动等),最后输出所有行或者仅输出处理的某些行.sed也可以在无交互的情况下实现相当复杂的文本处理操作,被广泛应用于shell脚本中,用以完成各种自动化处理任务.sed的工作流程主要包括读取.执行和显示三个过程: 读取:sed从输入流(文件.管道.标准输入)中读取一行内容并存储到临时的缓冲区中(也称为模式空间). 执行:默认情况下,所有的sed命令都在模式空间中顺序地执行,除非指定了行的

正则表达式跟sed命令(草稿)

正则表达式. 匹配任何单个的字符* 匹配在它之前的任何数目的单个字符(可以为正则表达式,如.*代表匹配任一字符的任意长度)^ 匹配紧接着的正则表达式,在行或字符串的起始处$ 匹配前面的正则表达式,在字符串或行结尾处[...] 匹配方括号内的任一字符((-)指的是连续字符的范围,(^)则由反向意义)\{n,m\} 匹配在它前面的单个字符重现的次数区间.\{n\}指的是重现n次: \{n,\}则为至少重现n次,\{n,m\}为重现n至m次\{ \} 将\与\之间的模式存储在特殊的“保留空间”(最多9

Sed 命令详解 正则表达式元字符

1.简介 sed是非交互式的编辑器.它不会修改文件,除非使用shell重定向来保存结果.默认情况下,所有的输出行都被打印到屏幕上. sed编辑器逐行处理文件(或输入),并将结果发送到屏幕.具体过程如下:首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间),然后处理临时缓冲区中的行,完成后把该行发送到屏幕上.sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示.处理完输入文件的最后一行后,sed便结束运行.sed把每一行都存在临时缓冲区中,对这个副本进行编辑,

正则表达式和sed命令的用法

一.            正则表达式:   正则表达式(或称Regular Expression,简称RE)就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式. 该模式描述在查找文字主体时待匹配的一个或多个字符串. 正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配.简单的说,正则表示式就是处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表示式通过一些特殊符号的辅助,可以让使用者轻易的达到搜寻/删除/取代某特定字符串的处理程序.vim.gre

linux sed命令中的正则表达式问号、加号、圆括号等需要转义

linux sed命令内的正则表达式语法分两种,一种叫Basic (BRE) Syntax,另一种叫Extended (ERE) Syntax.默认使用的是BRE. 这个BRE就是一个简化版,语法稍微有点不一样,问号.加号.圆括号.花括号和竖线没有特殊含义,就代表字符本身,如果要原本定义的实现特殊含义,需要用反斜杠(\)转义……详情请见: https://www.gnu.org/software/sed/manual/html_node/BRE-vs-ERE.html#BRE-vs-ERE