您的位置:首页 > 运维架构 > Linux

Linux 文本处理工具、grep、正则表达式

2016-12-23 22:05 666 查看
Linux 文件处理工具、grep、正则表达式:

抽取文本的工具
显示文件内容
less 一页一页查看文件标准输出输出
cat
-E 显示行结束符¥
-n 对显示的每一行进行编号
-A 显示所有控制符
-b 非空行编号
-s 压缩连续的空行 形成一行

文件截取
head、tail
按列抽取
cut
关键字抽取
grep
分页查看文件内容
more 分页查看文件
-d 显示翻页及退出提示

查看时有用的命令包括
/文本 搜索 文本
n/N 跳到下一个 or 上一个匹配
less 是man命令使用的分页器

显示文本前、后行的内容
head
-c # 制定获取前#字符
-n # 指定获取前#行
-# 指定行数
示列:
取出/etc/passwd的一到第四个字符
head -c4 /etc/passwd

tail
-c # 指定获取后#字节
-n # 指定获取后#行
-#
-f 跟踪显示文件新追加的内容,常用日志监控
示列:
取出/etc/passwd最后的五个字符
# tail -c5 /etc/passwd

按列抽取文本cut和合并文件paste
cut
-d 指明分隔符,默认tab
-f
#:第#个字段
#,#[#]:离散的多个字段,例如1,3,6
#-#:连续的多个字段,例如1-6
混合使用:1-3,7
-c 按字符切割
--output-delimiter=STRING指定输出分隔符
示列:
取出df的使用值
df |cut -c44-47
Use%
5%
0%
1%
1%
0%
1%
4%
1%
1%
100%
示列:取出/etc/passwd中的第一行
[root@localhost testdir]# cut -d: -f1 /etc/passwd
root
bin
daemon

cat和past:
显示文件或STDIN数据的指定列
cut -d:-f1 /etc/passwd
[root@localhost ~]# cut -d: -f1 /etc/passwd (显示第一列)
root
bin
daemon

cat /etc/passwd | cut -d: -f7 (显示第七列)
[root@localhost ~]# cat /etc/passwd | cut -d: -f7
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin

cut -c2-5 /usr/share/dict/words (显示一列的第2-第5个字符)

paste 合并两个文件同行号的列到一行
-d 分隔符:指定分隔符,默认用TAB
-s 所有行合成一行显示
paste f1 f2
paste -s f1 f2

收集文本统计数据 wc:
计数单词总数、行总数、字节总数和字符总数
可以对文件或标准输出中的数据运行
$ wc story.txt
39 237 1901 story.txt
行数 字数 字符数
使用 -l 来只计数行数
使用 -w 来只计数单词总数
使用 -c 来只计数字节总数
使用 -m 来只计数字符总数

文本排序sort:
把整理过的文本显示在标准输出,不改变原始文件
$ sort[options] file(s)
常用选型
-r 执行反方向(由上至下)整理
-n 执行按数字大小整理
-f 选项忽略(fold)字符串的字符大小写
-u 选项(独特,unique)删除输出中的重复行
-t c 选项使用c做为字段界定符
-K X 选项按照使用c字符分隔的X列来整理能够使用多次

uniq命令 从输入中删除重复的前后相接的行
-c 显示每行重复出现的次数
-d 仅显示重复过的行
-u 仅显示不曾重复的行
连续且完全相同方为重复
常和sort 命令一起配合使用
sort userlist.txt | uniq -c

比较文件

比较两个文件之间的区别
$ diff foo.conf-broken foo.conf-works
5c5
< use_widgets = no
---
> use_widgets = yes
注明第5行有区别(改变)

复制对文件改变patch
diff 命令的输出被保存在一种叫做“补丁”的文件中
使用 -u 选项来输出 “统一的(unified)” diff格式文件,最适用于补丁文件
patch 命令复制在其他文件中进行的改变(要谨慎使用!)
适用 -b 选项来自动备份改变了的文件
$ diff -u foo.conf-broken foo.conf-works > foo.patch
$ patch -b foo.conf-broken foo.patch

、查出用户UID最大值的用户名、UID及shell类型
# cut -d: -f1,3,5 /etc/passwd | sort -n -t: -k 2 | tail -n 1

、查出/tmp的权限,以数字方式显示
# stat /tmp | grep Uid | cut -d/ -f1 | cut -d"(" -f2
1777

Linux的文件处理三剑客
grep 文本过滤(模式:pattern)工具
grep,egrep,fgrep(不支持正则表达式搜索)
sed 文本编辑工具
awk Linux上的实现gawk,文本报告生成器

grep:全局性的搜索 正则表达式 打印对应的行

作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行
模式:有正则表达式字符及文本字符所编写的过滤条件

grep
grep root /etc/passwd
[root@localhost ~]# grep root /etc/passwd (搜索 root)
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

grep "$USER" /etc/passwd

grep '$USER' /etc/passwd

grep `whoami` /etc/passwd ` `:里面必须是命令

示列:
grep root /etc/passwd
显示root的字符以红色显示出来centos7 centos6是不显示红色的 要加上参数才行
[root@localhost testdir]# grep root /etc/passwd --color=auto
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
字符'

grep:
grep [选项] [关键字] [文件]
示列:
grep root /etc/passwd

选项参数:
--color=auto 对匹配到的文本着色显示
-v 不显示匹配到的行
grep -v root /etc/passwd 不显示root

-i 忽略字符大小写
grep -i ROoT /etc/passwd

-n 显示匹配的行号
# grep -n root /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin

-c 统计匹配的行数
grep -c root /etc/passwd 显示root有几个
2
-o 仅显示匹配到的字符串
# grep -o root /etc/passwd
root
root
root

-q 静,默模式,搜到不显示
grep -q root /etc/passwd

-A #:after,后#行
grep -n -A 3 root /etc/passwd 显示root的行和后面的3行都显示

-B #:before,前#行
# grep -n -B 3 root /etc/passwd 显示root的行和前面的3行

-C #:context,前后各#行
grep -n -C root 显示root的行、和前后的各3行

-e:实现多个选项间的逻辑or关系
grep -e 'cat' -e 'dog' file
# grep -e root -e chen /etc/passwd
-w:整行匹配整个单词
# grep -w roo /etc/passwd
-E 使用ERE 支持扩展正则表达式

正则表达式:
REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能
程序支持
grep、vim、less、nginx等
分两类:
基本正则表达式:BRE
扩展正则表达式:ERE
grep -E,egrep
正则表示式引擎:
采用不同算法,检查处理

字符匹配:
. 匹配任意单个西服
[] 匹配指定范围的任意单个字符
[^] 匹配指定范围外的任意但各自飞
[[:digit:]] 任意数字,相当于0-9
[[:lower:]] 任意小写字母
[[:upper:]] 任意大写字母
[[:alpha:]] 任意大小写字母
[[:alnum:]] 任意数字或字母
[[:space:]] 空格
[[:punct:]] 标点符号

正则表达式:
匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数
*:匹配前面的字符任意次,包括0次
贪婪模式:尽可能长的匹配
.*:任意长度的任意字符
\?:匹配其前面的字符0或1次
\+:匹配其前面的字符至少1次
\{m\}:匹配前面的字符m次
# grep "ro\{2\}t" /etc/passwd

\{m,n\}:匹配前面的字符至少m次,至多n次
# grep 'root\{1,5\}' /etc/passwd

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

\{m,\}:匹配前面的字符至少m次
位置锚定:定位出现的位置
^:行首锚定,用于模式的最左侧
grep "^root" /etc/passwd

$:行尾锚定,用于模式的最右侧
grep "bash$" /etc/passwd

^PATTERN$: 用于模式匹配整行

^$: 空行
grep -v "^$" f1

示列: 清除f1文件中的空白行
grep -v "^[[:space:]]*$" f1

^[[:space:]]*$ :空白行
[root@localhost ~]# grep -v "^[[:space:]]*$" f1
cat <<E
aa
bb
cc
E

\< 或\b:词首,用于单词模式的左侧
grep "\<root\>" f1

grep “\broot\b” f1
root
root root root

\> 或\b:词尾锚定;用于单词模式的右侧

\<PATTERN\>:匹配整个单词
分组:\(\):将一个或多个字符捆绑在一起,当作一个整体进行处理,如:\(root\)\+
分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, ...
\1: 从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符;
示列:\(string1\+\(string2\)*\)
\1: string1\+\(string2\)*
\2: string2
后向引用:引用前面的分组括号中的模式所匹配字符(而非模式本身)

练习:
1、显示/proc/meminfo文件中以大小s开头的行;(要求:使用两种方式)、
# grep "^S" /proc/meminfo

# grep "^[Ss]" /proc/meminfo

# grep -i "^[S]" /proc/meminfo

2、显示/etc/passwd文件中不以/bin/bash结尾的行
# grep -v "/bin/bash" /etc/passwd

3、显示用户rpc默认的shell程序
# grep "\brpc\b" /etc/passwd | cut -d: -f7

4、找出/etc/passwd中的两位或三位数
# grep -w -o "[0-9]\{2,3\}" /etc/passwd

5、显示/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面存非空白字符的行
# grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg

6、找出"netstat -tan"命令的结果中以'LISTEN'后跟0、1或多个空白字符结尾的行
# netstat -tan | grep "LISTEN[[:space:]]*$

7、添加用户bash、testbash、basher以及nologin(其shell为/sbin/nologin),而后找出/etc/passwd文件中用户名同shell名的行
# grep "^\(\b..*\b\).*\1$" /etc/passwd

扩展正则表达式:
字符匹配:
. 任意单个字符
[] 指定范围的字符
[^] 不在指定范围的字符

次数匹配:
* 匹配前面字符任意次
? 0或1次
+ 1次或多次
{m} 匹配m次
{m,n} 至少m,最多n次

位置锚定:
^ 行首
$ 行尾
\<,\b 语首
\>,\b 语尾
分组:
()
后向引用:\1,\2,. . .
或者:
a|b
c|cat c或cat
(C|c)at:Cat或cat
练习
显示当前系统root、mage或wang用户的UID和默认shell
# grep -E "^(root|mage|wang):" /etc/passwd | cut -d: -f3,7
0:/bin/bash
2203:/bin/bash
2204:/bin/bash
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息