Linux 文本处理三剑客

6 篇文章 0 订阅

1.grep 文本过滤器

1.1基本概念

  • grep 是一段话的缩写:Global search regular expression and print out the line(全面搜索研究正则表达式并显示出来)。grep 有三种形式:grep egrep fgrep(grep 家族)

  • 作用:grep 命令是一种强大的文本搜索工具,根据用户指定的“模式”对目标文本进行匹配检查,打印匹配到的行。

  • 模式(patten):由正则表达式或者字符及基本文本字符所编写的过滤条件

  • 正则表达式:由一类特殊字符及文本字符所编写的模式,其中有些字符不表示字符的字面意思,而表示控制或通配的功能。分为两类:1)基本正则表达式(BRE):grep 2)扩展正则表达式 (ERE): egrep grep –E

1.2 grep 的格式

  • grep 是根据基本正则表达式来工作的
  • 默认情况下:正则表达式工作于贪婪模式
  • 使用扩展 grep 的主要好处是增加了额外的正则表达式元字符;grep -E = egrep

(1)grep常用命令

  • grep root passwd 搜索passwd文件中的root
  • grep “^root” passwd 搜索passwd文件中以root开头的
  • grep “root$” passwd 搜索passwd文件中以root结尾的
  • grep -i root passwd 忽略大小写搜索passwd文件
  • grep -Ei “root|ROOT” passwd 同时匹配多个条件
  • grep “root$” passwd -n 搜索以root结尾的,并排序
  • grep “root$” passwd -v 搜索非root结尾的,条件取反
  • grep “root$” passwd -B1 搜索出以root结尾的行并显示其前1行
  • grep “root$” passwd -A1 搜索出以root结尾的行并显示其后1行
  • grep “root$” passwd -2 搜索出以root结尾的行并显示前上下2行

(2)正则表达式

1)匹配单个任意字符

(出现元字符 用引号引起来 “”:弱引用(意味着:双引号中间有变量的话,变量可先被替换) ‘’:强引用(直接匹配每个字符))

  • grep ‘s…n’ /etc/passwd
  • grep ‘…t’ /etc/passwd

2)匹配任意字符

用在指定字符的后面,用于指定前面的字符要出现的次数

*:匹配前面的字符任意次(仅表示次数 0 次 1 次 多次)

  • grep ‘x*y’ test

.*:表示任意字符任意长度(.表示任意字符 *表示任意长度)

  • grep ‘a.*y’ (a 和 y 之间可以有任意字符)

\?:匹配前面的字符 0 次或者1次(前面的字符可有可无 有:只匹配1次 无:匹配0次)
(?在 bash shell 中有特殊意义 所以要有转义字符)

  • grep ‘x?y’ test

\+:匹配其前面的字符,至少出现一次(一次或者多次)

  • grep ‘x+y’ test

3)精确匹配字符

\{m\}精确匹配字符 m 次 : ({ }在 bsah shall 有特殊意义 命令行展开)

  • grep ‘[[:alpha:]]{3}t’ /etc/passwd

\{m,n\}:匹配前面的字符至少 m 次,至多 n 次

  • grep ‘[[:alpha:]]{1,3}t’ /etc/passwd

\{0,n\}:匹配前面的字符至多 n 次

\{m,\}:匹配前面的字符至少 m 次,多则不限

4)位置绑定

^:行首绑定:出现于模式的最左侧
$:行尾绑定:出现于模式的最右侧

  • grep ‘^[[:alpha:]]\{1,3\}t’ /etc/passwd
  • grep ‘[[:alpha:]]\{1,3\}t$’ /etc/passwd
  • grep ‘^[[:alpha:]]\{1,3\}t$’ /etc/passwd (^patten$:用于模式匹配整行)

\< :词首绑定,用于单词模式的左侧
\>:词尾绑定,用于单词模式的右侧
\<pattern\>: 匹配整个单词

  • grep ‘<[[:alpha:]]{1,3}t’ /etc/passwd
  • grep ‘[[:alpha:]]{1,3}t>’ /etc/passwd

5)分组

\(\):将一个或者多个字符绑定在一起,当做一个整体进行处理

  • grep ‘(xy)+’ test (xy 至少出现一次)
  • grep ‘xy+’ test (如果不加小括号 这表示 x 后面至少一个 y)

(3)扩展正则表达式

|:正规的 grep 不支持扩展的正则表达式子,竖线是用于表示”或”的扩展正则表达式元字符,正规的 grep 无法识别

[root@desktop grep]# egrep '^root|root$' passwd
root:x:0:0:root:/root:/bin/bash
root ROOT WESTOS root
[root@desktop grep]# grep '^root|root$' passwd
[root@desktop grep]# grep '^root\|root$' passwd
root:x:0:0:root:/root:/bin/bash
root ROOT WESTOS root

+:打印所有包含一个或者多个 root 的行

[root@desktop grep]# egrep 'root+' passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
root root root ROOT WESTOS root[root@desktop grep]# grep 'root+' passwd
[root@desktop grep]# grep 'root\+' passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
root root root ROOT WESTOS root

..\加上反斜杠,这个字符就被翻译成扩展正则表达式,就像 egrp 和grep -E 一样

[root@foundation70 mn]# grep -i "^root\|root$"  passwd
root:x:0:0:root:/root:/bin/bash
ROOT:WESTOS:root
You have new mail in /var/spool/mail/root
[root@foundation70 mn]# grep -i "^root|root$"  passwd
[root@foundation70 mn]# grep -iE "^root|root$"  passwd
root:x:0:0:root:/root:/bin/bash
ROOT:WESTOS:root

.?:打印所有这样的行,该行包含这样的字符串

[root@desktop grep]# egrep '2\.?[0-9]' passwd
Rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin
274321974921
[root@desktop grep]# grep '2\.?[0-9]' passwd
[root@desktop grep]# grep '2\.\?[0-9]' passwd
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin
274321974921():打印包含一个或者多个连续的 no 的行
grep '\(no\)\+' passwd
grep '(no)+' passwd

2.sed 文本编辑器

2.1基本概念

  • sed=stream editor 文本编辑器:sed是一种在线编辑器,它一次处理一行内容。用来操作纯 ASCII 码的文本。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space)。

  • 模式空间: sed不是所有的行都处理,可以指定仅仅处理哪些行,所以 sed 可以像 grep 一样做模式过滤的,符合模式条件的处理 不符合条件的不予处理 ,接着用sed 编辑命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。Sed 主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等

  • 编辑器分为两类:一类为文本编辑器,另一类叫做全屏编辑器vim。

2.2 sed基本用法

  • 定址:可以通过定址来定位你所希望编辑的行,该地址用数字构成,用逗号分隔的两个行数表示以这两行为起止的行的范围(包括行数表示的那两行)。如 1,3 表示 1,2,3 行,美元符号($)表示最后一行。范围可以通过数据,正则表达式或者二者结合的方式确定

(1)p模式:(与 d 模式一样 前面都要给定址范围的)
P模式不能显示n-m行,只能显示n行与m行

   [root@foundation70 mn]# ifconfig | sed -n '2-4p' 
sed: -e expression #1, char 2: unknown command: `-'
[root@foundation70 mn]# ifconfig | sed -n '2,4p' 
        inet 172.25.254.1  netmask 255.255.255.0  broadcast 172.25.254.255
        ether da:4b:af:85:14:fb  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
[root@foundation70 mn]# 
 [root@desktop sed]# head -n 6 passwd|tail -n 2
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync
    [root@desktop sed]# sed -n '5,6p' passwd
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync

1) Sed 文本定位
匹配元字符:如果 sed 命令所要匹配的目标字符串中包含元字符,需要使用转义符“\”屏蔽所有特殊意义

[root@desktop sed]# sed -n '/\:/p' fstab
#Created by anaconda on Wed May 7 01:22:57 2014
UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1::  xfs   defaults    /    1 1

2)行批匹配

[root@desktop sed]# sed -n '/UUID$/p' fstab
[root@desktop sed]# sed -n '/^UUID/p' fstab!符号:匹配不在指定行号范围内的行
[root@desktop sed]# sed -n '2,6!p' fstab
sed ‘/UUID/p’/etc/fstab
sed ‘-n /UUID/p’/etc/fstab

-n 禁止打印模式空间 p:只是打印能模式空间能匹配的行

(2)d模式:删除模式空间中匹配的行,将其他行输出到字符设备

sed ‘/^UUID/d’ /etc/fstab
sed ‘/^#/d’ /etc/fstab
sed ‘/^$/d’/etc/fstab (删除所有空白行 一开始就结束了)
sed ‘1,4d’/etc/fstab (d 命令可以和地址定界一起使用)
sed –n ‘/^UUID/!d’ /etc/fstab 对地址定界取反 除了 UUID 开头的行都删除

(3)a模式:追加行到每一行符合条件的行后面

sed ‘/^UUID/a \hello sed /etc/fstab’(追加到每一行符合条件的行后面)
sed ‘/^UUID/a \hello sed\nwestos /etc/fstab’(支持多行追加)

(4)i模式:在符合条件的行前面插入行

sed ‘/^UUID/i\hello sed\nwestos /etc/fstab’(追加在符合条件的行前面)

(5)c模式:改变符合条件的单行或多行文本

sed ‘/^UUID/c\hello sed\nwestos /etc/fstab’(替换符合条件的单行或多行文本)

(6)w模式:将符合条件的行保存到其他文件

sed ‘/^UUID/w /tmp/fstab.txt’ /etc/fstab (把/etc/fstab 中
UUID 开头的行保存到/tmp/fstab 中)
sed -n‘/^UUID/w /tmp/fstab.txt’ /etc/fstab
sed ‘/^UUID/=’/etc/fstab (打印行号)
sed ‘6r /etc/issue’ /etc/fstab (把/etc/issue 文件内容放置到/etc/fstab 中的第六行)

(7)Sed -e 的用法:将下一个字符串解析为 sed 编辑命令

[root@desktop sed]# sed -n '/^UUID/=' fstab
9  打印行内容及行号,传递两个编辑命令给 sed

[root@desktop sed]# sed -n -e '/^UUID/p' -e '/^UUID/=' fstab
    UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1    xfs     defaults    1 1

(8)查找并替换

sed -e 's/brown/green/; s/dog/cat/' data
cat script
s/brown/green/
s/fox/elephant/
s/dog/cat/
sed -f script data
sed ‘s/oot/OOT/’ /etc/fstab (把/etc/fstab 中的 oot 变成大写的 OOT)
可以使用正则表达式,把行首的/换成# sed ‘s/^\//#/’/etc/fstab
sed ‘s@^/@#@g’/etc/fstab (如果不想用转义字符的话 可以换转为@
sed ‘s/\//#/’/etc/fstab 
sed ‘s/\//#/g/’/etc/fstab

(9)加倍行间距:G

sed '$!G' data
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog

3.awk报告生成器

  • awk:报告生成器 。是三位创始人名字的缩写,文本报告生成器 (能够将给定文本以非常美观的形式显示出来)
  • awk处理机制:逐行处理文本

(1)-F 指定分隔符

vim westos.txt
1111111 Westos
2222 IT G
awk ‘{print $1}’westos.txt
awk –F “s”‘{print $1}’westos.txt

awk -F "in" '{print $1, $3}' /etc/passwd
awk -F [:/] '{print $1, $10}' /etc/passwd (awk 还识别多种单个的字符串,比如“:或者/分隔,输出第 1,10 个字段

awk 的简单用法

vim testthis is a test
awk ‘{print $1}’test
awk ‘{print $0}’test
awk ‘{print $4}’test x
awk ‘{print $1,$2}’test
awk ‘ {print $1,$3} /etc/passwd 
awk –F “:”’{print $1,$2}’/etc/passwd
awk –F “:”’{print $1”,”$2}’/etc/passwd ( 输 出/etc/passwd 文件中以冒号分隔的第 1,第 2 个字段,显示的不同字段之间以逗号隔开)

awk 简单的小练习:
输出本机的 IP 地址:
ifconfig eth0 | grep 'inet ' | awk '{print $2}'
输出本机的根分区使用率:
df -hT / | tail -1 | awk '{print $6}' ##-h(或者 human) :以可读性较高的方式来显示
##-T :显示文件系统的类型

(2)awk 内置常用变量
注意:调用 awk 的内置变量时,不需要加前置$符号
1)NR行、NF列

awk '{print FILENAME,NR}' passwd.txt(使用 awk 输出当前操作的文件名,当前处理的行号)
awk -F: '{print NR,NF}' passwd.txt (输出每次处理的行号,以及当前行以:,分隔的字段个数)
awk ‘{print “第”NR”行”,“有”NF“列”}’ passwd.txt

2)BEGIN、END

BEGIN{ }:读入第一行文本之前执行,一般用来初始化操作{ }:逐行处理:逐行读入文本执行相应的处理,是最常见的编辑指令块
END{ }:处理完最后一行文本之后执行,一般用来输出处理结果

awk ‘BEGIN{a=34;print a+12}’(预处理不需要数据的文件)
awk ‘BEGIN{X=0}/\<bash$/{x++}\END{print x}’/etc/passwd 
awk ‘BEGIN{print NR}END{print NR}’westos.txt//预处理时,行数为 0
//全部处理完以后,行数为已读入文本行数

(3)条件设置示例正则表达式

awk -F: '/bash$/{print}' passwd.txt (输出其中以 bash 结尾的完整记录)
awk –F : ‘/^ro/{print}’ /etc/passwd (列出以 ro 开头的用户记录)
awk -F: '/^[a-d]/{print $1,$6}' passwd.txt (输出以 a,b,c 或着 d 开头的用户名,宿主目录)
awk -F: '/^a|nologin$/{print $1,$7}' passwd.txt (输出其中用名以 a 开头,登陆 shell 以 nologin 结尾的用户名,登陆 shell)
awk -F: '$6~/bin$/{print $1,$6}' passwd.txt (输出其中宿主目录以 bin 结尾(对第 6 个字作~匹配的用户名,宿主目录信息))
awk -F: '$7!~/nologin$/{print $1,$7}' passwd.txt (输出其中登陆 shell 不以 nologin 结尾(对第 7 个字段做!~反向匹配)的用户名,登陆 shell信息)

(4)条件设置示例数值比较

Vim linux.txt
Abcd XX
XX
Abcabcd XX
awk ‘NR==2{print}’linux.txt (输出第二行文本)
awk ‘$2!=”XX”{print}’linux.txt (输出第二列不是 XX 的行)
awk ‘NF>=2{print}’linux.txt (输出包含 2 个及以上字段的行)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值