[CentOS 7系列]grep/sed/awk高级扩展

在上一帖的实战中,我们用到了grep的"-Po"的用法。首先,我们来看看这几个参数的含义:

      -P, --perl-regexp
              Interpret  PATTERN as a Perl regular expression.  This is highly
              experimental and grep -P may warn of unimplemented features.
      
      -o, --only-matching
              Print only the matched (non-empty) parts  of  a  matching  line,
              with each such part on a separate output line.

“-P”表示采用的模式是Perl正则表达式的模式,“-o”表示只需要匹配到的内容。

像这种参数在平时是很少使用的,需要经常翻看命令手册和实例,熟悉这些用法,以备不时之需。

下面整理了几个非主流实例,通过实例熟悉下sed和awk的扩展用法。

sed

1、打印某行到某行之间的内容

[[email protected] test2]# sed -n ‘/lp/,/shutdown/‘p passwd
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

2、转换大小写

使用\u表示大写,\l表示小写

▼把每个单词的第一个小写字母变大写:

[[email protected] test2]# sed ‘s/\b[a-z]/\u&/g‘ passwd
Root:X:0:0:Root:/Root:/Bin/Bash
Bin:X:1:1:Bin:/Bin:/Sbin/Nologin
Daemon:X:2:2:Daemon:/Sbin:/Sbin/Nologin
......

▼把所有小写变大写:

[[email protected] test2]# sed ‘s/[a-z]/\u&/g‘ passwd
ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN
DAEMON:X:2:2:DAEMON:/SBIN:/SBIN/NOLOGIN
......

▼大写变小写:

[[email protected] test2]# sed ‘s/[A-Z]/\l&/g‘ /etc/logrotate.conf
......
# rpm packages drop log rotation information into this directory
include /etc/logrotate.d
......

3、在某一行最后添加字符串

[[email protected] test2]# sed ‘s/\(^shutdown.*\)/\1 123abc/‘ passwd | grep shutdown
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 123abc

4、删除某行到最后一行

[[email protected] test2]# sed ‘/shutdown/{p;:a;N;$!ba;d}‘ passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

定义一个标签a,匹配shutdown这个关键词,然后N把下一行加到模式空间里,匹配最后一行时,才退出标签循环,然后命令d,把这个模式空间里的内容全部清除。

5、打印某行到某行含某个字符串的行

[[email protected] test2]# sed -n ‘1,10{/nologin/p}‘ passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

awk

1、使用外部shell变量

[[email protected] test2]# A=100
[[email protected] test2]# echo "ABCD" | awk -v GETA=$A ‘{print GETA}‘
100

2、合并一个文件

▼第一列相同的行合并到同一行中:

[[email protected] test2]# cat a.txt
1 a1
2 a2
3 a3
4 a4
[[email protected] test2]# cat b.txt
1 b1
2 b2
3 b3
4 b4
[[email protected] test2]# awk ‘NR==FNR{a[$1]=$2}NR>FNR{print $0,a[$1]}‘ a.txt b.txt
1 b1 a1
2 b2 a2
3 b3 a3
4 b4 a4

NR表示读取的行数,FNR表示读取的当前行数。

所以其实NR==FNR,就表示读取b.txt的时候。 同理NR>FNR表示读取a.txt的时候。

数组a其实就相当于一个map。

3、把一个文件多行连接成一行

[[email protected] test2]# a=`cat a.txt`;echo $a
1 a1 2 a2 3 a3 4 a4
[[email protected] test2]# awk ‘{printf("%s ",$0)}‘ a.txt
1 a1 2 a2 3 a3 4 a4
[[email protected] test2]# cat a.txt |xargs
1 a1 2 a2 3 a3 4 a4

4、gsub函数

[[email protected] test2]# grep ‘root‘ passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[[email protected] test2]# awk ‘gsub(/root/,"abc")‘ passwd
abc:x:0:0:abc:/abc:/bin/bash
operator:x:11:0:operator:/abc:/sbin/nologin

5、生成特殊结构文件

▼用awk编写生成以下结构文件的程序。( 最后列使用现在的时间,时间格式为YYYYMMDDHHMISS)  各列的值应如下所示,每增加一行便加1,共500万行。

1,1,0000000001,0000000001,0000000001,0000000001,0000000001,0000000001,2005100110101
2,2,0000000002,0000000002,0000000002,0000000002,0000000002,0000000002,2005100110101

[[email protected] test2]# awk ‘BEGIN{for(i=1;i<=5000000;i++)printf("%d,%d,%010d,%010d,%010d,%010d,%010d,%010d,%d\n",i,i,i,i,i,i,i,i,strftime("%Y%m%d%H%M"))}‘
1,1,0000000001,0000000001,0000000001,0000000001,0000000001,0000000001,201706282126
2,2,0000000002,0000000002,0000000002,0000000002,0000000002,0000000002,201706282126
3,3,0000000003,0000000003,0000000003,0000000003,0000000003,0000000003,201706282126
4,4,0000000004,0000000004,0000000004,0000000004,0000000004,0000000004,201706282126
5,5,0000000005,0000000005,0000000005,0000000005,0000000005,0000000005,201706282126
6,6,0000000006,0000000006,0000000006,0000000006,0000000006,0000000006,201706282126
7,7,0000000007,0000000007,0000000007,0000000007,0000000007,0000000007,201706282126
8,8,0000000008,0000000008,0000000008,0000000008,0000000008,0000000008,201706282126
9,9,0000000009,0000000009,0000000009,0000000009,0000000009,0000000009,201706282126
10,10,0000000010,0000000010,0000000010,0000000010,0000000010,0000000010,201706282126
......

6、用print打印单引号

[[email protected] test2]# awk ‘{print "‘"‘"‘"$1}‘ a.txt
‘1
‘2
‘3
‘4

在awk中使用脱义字符\是起不到作用的,如果想打印特殊字符,只能使用‘""‘这样的组合才可以。

这里自左至右为单引号 双引号 双引号 单引号。其中两个单引号为一对,两个双引号为一对。想脱义$那就是‘"$"‘ 脱义单引号那就是 ‘"‘"‘。

7、提取eth0的IP信息

[[email protected] test2]# ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.137.100  netmask 255.255.255.0  broadcast 192.168.137.255
        inet6 fe80::c1d7:5856:9856:2bb8  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:0c:4d:a8  txqueuelen 1000  (Ethernet)
        RX packets 160327  bytes 130100204 (124.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 88376  bytes 52770231 (50.3 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        
[[email protected] test2]# ifconfig ens33 | awk -F "[^0-9.]+" ‘NR==2{print $2,$3,$4}‘
192.168.137.100 255.255.255.0 192.168.137.255

8、合并两个文件

[[email protected] test2]# paste  a.txt b.txt
1 a1    1 b1
2 a2    2 b2
3 a3    3 b3
4 a4    4 b4
[[email protected] test2]# paste -d ‘+‘  a.txt b.txt
1 a1+1 b1
2 a2+2 b2
3 a3+3 b3
4 a4+4 b4
时间: 2024-12-30 19:18:05

[CentOS 7系列]grep/sed/awk高级扩展的相关文章

[CentOS 7系列]grep/sed/awk实战

最近准备和CoreSite - Any2 California接入商建立网络BGP邻居关系.从peeringdb (https://www.peeringdb.com/ix/142)上找到了所有接入商的信息,但是转移信息到本地不是很方便,需要进行多次文本调整,耗时较长.作为萌新,立马就想到近期学习的grep/sed/awk工具.于是就尝试处理数据. 1.下载页面内容 curl https://www.peeringdb.com/ix/142 > peering 将页面内容存入peering文件

Linux三剑客grep/sed/awk

grep/sed/awk被称为linux的“三剑客” grep更适合单纯的查找或匹配文本: sed更适合编辑匹配到的文本: awk更适合格式化文本,对文本进行较复杂各式处理: Grep --color=auto 或者 --color:表示对匹配到的文本着色显示 -i:在搜索的时候忽略大小写 -n:显示结果所在行号 -c:统计匹配到的行数,注意,是匹配到的总行数,不是匹配到的次数 -o:只显示符合条件的字符串,但是不整行显示,每个符合条件的字符串单独显示一行 -v:输出不带关键字的行(反向查询,反

LINUX 下 find grep sed awk 的常见基本用法特点

LINUX 下 find grep sed awk 的常见基本用法特点 只为让自己具有更高的水准,这就开始了长达6个月的小白进阶路! 这几天学习linux基础命令有点犯蒙,尤其是对文件查找这块.所有我想把一些我觉得常用的实用的参数项总结下来,大神勿喷哈... 不到之处请大家指教,小女子在此谢过了. 一.find:命令用于查找文件系统中指定的文件,其命令格式为: 1.find pathname -options [ -print  -exec  -ok ... ] (1)find 命令的参数: p

grep,sed,awk与简单正则表达式应用

grep,sed,awk与简单正则表达式应用 这里使用的测试文件是linux /etc/passwd文件,最好是复制一份进行练习,方式对文件内容造成损坏.感觉还是要多练习才能很好的使用,习题这里就不贴了,网上一找一大把. grep:   -o 用作计算出现多少次字段  -c 打印符合要求的行数  -n 在输出符合要求的行的同时也打印行号  -v 打印不符合要求的行  -A 后跟一个数字 ps -A2表示打印符合要求的行及下面两行  -B 后跟一个数字 ps -B2表示打印符合要求的行及上面两行 

十七. 正则以及grep ,sed,awk的简单应用

一.正则表达式:/ / grep,sed,awk 都能解释正则表达式 正则表达式:把一些特殊符号组合到一起描述字符和字符串的方法.^ 以什么开头 grep '^root' /etc/passwd$ 以什么结尾 如能登入系统的所有用 grep 'bash$'/etc/passwd. 任意一个字符 grep '^b.n' /etc/passwd 过滤取到bin的.* 所有字符* 代表前面的字符有0个或者无穷个 grep 'b*' /+ 必须用egrep 或 egrep -E 'ab+'表示前面的字符

linux下查找文件及文件内查找内容--find/grep/sed/awk

1.find 查找到想要的文件或目录 格式:find  [path]   [-OPTION]  [-exec |grep  |xargs   -ok  -print   | ……]   [command  {} \;] 参数: -type    以类型查找 f    文件 d   目录 -name    以文件名查找 -size    根据问价大小来查找.eg:  find /data -size 5M -perm    根据文件权限查找.  eg: find /data -perm 755 -

三个支持正则表达式的行处理的工具: grep/sed/awk

grep: 全称Global Regular Expression Print, 是干什么的,不多说了: 用法:grep [-options] [pattern] [filename] 选项: -c: 只输出匹配行的数目 -i: 不区分大小写 -n:显示匹配航以及行号 -l:查询多文件的时候只输出包含匹配字符的文件名 -L: 列出不匹配的文件名: -v:反向匹配,即显示不匹配的行 -h: 查询的时候不适用文件名 -s:不显示错误信息 -E 使用扩展正则表达式 //很有用啊, -A :后跟一个数字

六、三剑客grep/sed/awk

6.1.正则表达式  正则表达式: 是一类字符所书写出的模式(pattern):元字符:不表示字符本身的意义,用于额外功能性的描述.  1) 基本正则表达式: BRE元字符: .: 匹配任意单个字符 [char]: 匹配指定范围内的任意单个字符 [^char]:匹配指定范围外的任意单个字符 字符集合: [:digit:], [:lower:], [:upper:], [:punct:], [:space:], [:alpha:], [:alnum:] 匹配次数( 贪婪模式) : *: 匹配其前面

linux grep,sed,awk和diff的使用

1:grep//显示行 # grep 'main' /home/myhome/a.c//将a.c含有main的行显示出来 # grep -v 'main' /home/myhome/a.c //显示除了main那行的所有行 # grep -n 'the' a.c//显示a.c含有the的行 # grep -vn 'the' a.c//显示没有the的行 # grep -in 'the' a.c//不考虑大小写 # grep -n t[ae]st a.c//[]只算一个字符,搜到含有test和ta