文本处理
1.文本处理工具:
1 文件内容:less和 cat
2 文件截取:head和tail
3 按列抽取:cut
4 按关键字抽取:grep
2.文本查看
文件查看命令:cat tac rev
cat -v 显示非打印字符
-E 显示$
-T 显示TAB
-n 显示行号
-s 将连续的重复行变成一行
-A = -vET
Tac
Rev
rev命令将文件中的每行内容以字符为单位反序输出,即第一个字符最后输出,最后一个字符最先输出,依次类推。
3.分页查看文件内容
more: 分页查看文件
more [OPTIONS…] FILE…
-d: 显示翻页及退出提示
less:一页一页地查看文件或STDIN输出
查看时有用的命令包括:
/文本 搜索 文本
n/N 跳到下一个 或 上一个匹配
less 命令是man命令使用的分页器
4显示文本前或后行内容
e:文件内容显示完毕后,自动退出;
-f:强制显示文件;
-g:不加亮显示搜索到的所有关键词,仅显示当前显示的关键字,以提高显示速度;
-l:搜索时忽略大小写的差异; -N:每一行行首显示行号;
-s:将连续多个空行压缩成一行显示;
-S:在单行显示较长的内容,而不换行显示;
-x<数字>:将TAB字符显示为指定个数的空格字符
head
-n 行号 显示前n行
-行号 显示前n行
-c 字节数 显示前n个字节
tail
-n 行号 显示后n行
-行号 显示后n行
-c 字节数 显示后n个字节
-f 动态显示
head
Head - c
Tail –n
Tail -2
Tail –c
Tail –f
显示实时信息
练习:
显示/etc/passwd文件的第11行至第20行
head -n 20 /etc/passwd |tail -11
利用 cat /dev/urandom 生成10位字符长度的随机密码(包含大小写字母及数字)
cat /dev/urandom | tr -d -c ‘[:alnum:][:punct:]’ | head -c 10 ;echo
5按列抽取文本cut和合并文件paste
5.1cut [OPTION]… [FILE]…
d DELIMITER: 指明分隔符,默认tab
-f FILEDS:
1.#第#个字段
2.#,#[,#]:离散的多个字段,例如1,3,6 #-#
3.连续的多个字段, 例如1-6
混合使用:1-3,7
-c 按字符切割
–output-delimiter=STRING指定输出分隔符
例如:
1查看 /etc/passwd 的第一列
[root@localhost app]# cut -d: -f 1 /etc/passwd
2查看 /etc/passwd 的用户名和UID
3查看 /etc/passwd 的用户名到UID的信息
4.换输出的单引号
练习
1.显示当前主机第一个网卡的IP地址
ifconfig |head -n 2| tail -n 1| tr -s ’ ’ : |cut -d: -f4
2.查出/app目录的空间使用量
df|tr -s [[:space:]]|head -n 4|tail -n 1|cut -d ’ ’ -f5|cut -d ‘%’ -f1
df|tr -s ” ” % |head -n 4 |tail -n 1 |cut -d% -f5
df |head -n 8 |tail -n 1 |cut -c 44-46
3.利用 cat /dev/urandom 生成10位字符长度的随机密码(包含大小写字母及数字)
cat /dev/urandom | tr -d -c ‘[:alnum:][:punct:]’ | head -c 10 ;echo (大小写字母数字特殊号)
-d 指定分隔符
-f 选取第几列
n
n-r
n,n-r
–output-delimiter 指定输出符
cut -d: -f1,3 --output-delimiter='|' /etc/passwd
显示文件或STDIN数据的指定列
cut -d: -f1 /etc/passwd
cat /etc/passwd | cut -d: -f7
cut -c2-5 /usr/share/dict/words
5.2.paste 合并两个文件同行号的列到一行
paste [OPTION]… [FILE]…
-d 分隔符:指定分隔符,默认用TAB
-s : 所有行合成一行显示
paste f1 f2
paste -s f1 f2
5分析文本的工具
文本数据统计:wc
整理文本:sort
比较文件:diff和patch
5.3收集文本统计数据wc
计数单词总数、行总数、字节总数和字符总数
可以对文件或STDIN中的数据运行
$ wc story.txt
39 237 1901 story.txt
行数 字数 字符数
使用 -l 来只计数行数
使用 -w 来只计数单词总数
使用 -c 来只计数字节总数
使用 -m 来只计数字符总数
6文本排序sort
把整理过的文本显示在STDOUT,不改变原始文件
$ sort [options] file(s)
常用选项
-r 执行反方向(由上至下)整理
-n 执行按数字大小整理
-f 选项忽略(fold)字符串中的字符大小写
-u 选项(独特,unique)删除输出中的重复行
-t c 选项使用c做为字段界定符
-k X 选项按照使用c字符分隔的X列来整理能够使用多次
7.uniq
uniq命令:从输入中删除前后相接的重复的行
uniq [OPTION]… [FILE]…
-c: 显示每行重复出现的次数
-d: 仅显示重复过的行
-u: 仅显示不曾重复的行
连续且完全相同方为重复
常和sort 命令一起配合使用:
sort userlist.txt | uniq -c
Uniq -d
8.比较文件
比较两个文件之间的区别
difffoo.conf−brokenfoo.conf−works5c5<usewidgets=no—>usewidgets=yes注明第5行有区别(改变)复制对文件改变patchdiff命令的输出被保存在一种叫做“补丁”的文件中使用−u选项来输出“统一的(unified)”diff格式文件,最适用于补丁文件。patch复制在其它文件中进行的改变(要谨慎使用)适用−b选项来自动备份改变了的文件 diff -u foo.conf-broken foo.conf-works > foo.patch
$ patch -b foo.conf-broken foo.patch
补丁
Patch
有centos7,生成的补丁导入centos6里,实例:
练习
1、找出ifconfig “网卡名” 命令结果中本机的IPv4地址
[root@localhost ~]# ifconfig |head -2|tail -1|tr -s ” ” :|cut -d: -f3
2、查出分区空间使用率的最大百分比值
[root@localhost ~]# df|tr -s ’ ’ %|sort -t% -k5 -n|tail -1|cut -d% -f5
3、查出用户UID最大值的用户名、UID及shell类型
cat /etc/passwd |cut -d: -f1,3,7|sort -n -t : -k 2|tail -n 1
4、查出/tmp的权限,以数字方式显示
[root@localhost ~]# stat /tmp |head -4|tail -1|cut -d/ -f1|cut -d’(’ -f2
1777
[root@localhost ~]# stat -c %a /tmp/
1777
5、统计当前连接本机的每个远程主机IP的连接数,并按从大
到小排序
[root@localhost ~]# netstat -tun|grep ESTAB|tr -s ’ ’ :|cut -d: -f6|sort -nr|uniq -c
9正则表达式
Grep
1、作用:
文本搜索工具,根据用户指定的“模式”对目标文
本逐行进行匹配检查;打印匹配到的行
2,模式:
由正则表达式字符及文本字符所编写的过滤条件
1.命令格式:
grep [option] pattern file
grep root /etc/passwd
grep “USER”/etc/passwdgrep‘USER’ /etc/passwd
grep whoami
/etc/passwd
3,grep命令选项及功能
–color=auto: 对匹配到的文本着色显示
-v: 显示不被pattern匹配到的行
-i: 忽略字符大小写
-n:显示匹配的行号
-c: 统计匹配的行数
-o: 仅显示匹配到的字符串
-q: 静默模式,不输出任何信息
-A #: after, 后#行
-B #: before, 前#行
-C #:context, 前后各#行
-e:实现多个选项间的逻辑or关系
grep –e ‘cat ’ -e ‘dog’ file
-w:匹配整个单词
-E:使用ERE
-F:相当于fgrep,不支持正则表达式
实例:
1.调用变量和命令执行的结果
2.grep –color=auto: 对匹配到的文本着色显示
2.5 grep -v 显示不被pattern匹配到的行
3grep -i 忽略大小写
4 grep -n 显示行号
5 grep -c 行数
6.grep -o 显示匹配的字符串
7.grep -q 静默模式,不输出任何信息
Ping
grep:
8 Grep -A/B显示搜索内容的前三行和后三行
Grep-c 2 显示前2行和后2行
9 grep -e 关键字1 -e 关键字2 实现多个选项间的逻辑or关系
10 grep -w 匹配整个单词
10.规则表达式:
分两类:
基本正则表达式:BRE
扩展正则表达式:ERE
grep -E, egrep
正则表达式引擎:
采用不同算法,检查处理正则表达式的软件模块
PCRE(Perl Compatible Regular Expressions)
元字符分类:字符匹配、匹配次数、位置锚定、分组
man 7 regex
grep 的规则表达式:
字符匹配
. #匹配单个字符,如 ‘gr.p’ 匹配gr 后接一个任意字符,然后是 P.
[] #匹配一个指定范围内的字符,如 ‘[Gg]rep’匹配 Grep 和grep 。
???[^] #匹配一个不在指定范围内的字符,如 ‘[^A-FH-Z]rep’ 匹配不包含A-R和 T-Z的一个字母开头,紧跟 rep 的行。
[:alnum:] 字母和数字
[:alpha:] 英文大小EP写,A-Z,a-z
[:digit:] 十进制数字字符 [:xdigit:]十六进制数字(0-9,a-f,A-F)R
[:graph:] 非空白字符(非空格、控制字符)
[:blank:] 空白字符(空格和制表符)
[:lower:] 小写字符 a-z
[:upper:] 大写字符 = A-Z
[:cntrl:] 控制字符 (退格,删除,响铃。。。)
[:print:] 可打印的字符(包括空格)
[:punct:] 标点符号
[:space:] 所有空白字符(新行,空格,制表符)
1 grep .
2 grep []
3.grep [^]
4.
匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数
* 匹配前面的字符任意次,包括0次 如 ‘*grep ’ 匹配所有一个或多个空格后紧跟 grep 的行。
贪婪模式:尽可能长的匹配
.* 任意长度的任意字符
\? 匹配其前面的字符0或1次
+ 匹配其前面的字符至少1次
x{m} #重复字符x,m 次,如 ‘0{5}’匹配包含5个0的行。
x{m,} #重复字符x,至少m次,如 ‘o{5,}’ 匹配至少有5个o 的行。
x{m,n} #重复字符x,至少m次,不多于n次,如 ‘o{5,10}’匹配5–10个o的行。
{,n} 匹配前面的字符至多n次
1
2.grep x{m}
3.x{m,n}
位置锚定:定位出现的位置
1
2
3
分组:() 将一个或多个字符捆绑在一起,当作一个整体进
行处理,如:(root)+
分组括号中的模式匹配到的内容会被正则表达式引擎记录于
内部的变量中,这些变量的命名方式为: \1, \2, \3, …
\1 表示从左侧起第一个左括号以及与之匹配右括号之间的
模式所匹配到的字符
示例:
(string1+(string2)*)
\1 :string1+(string2)*
\2 :string2
后向引用:引用前面的分组括号中的模式所匹配字符,而非
模式本身
或者:|
示例:a|b: a或b C|cat: C或cat (C|c)at:Cat或cat
实例:
1
2
3
4
5
6
5.POSIX字符:
为了在不同国家的字符编码中保持一至,POSIX(the portable operating system interface )增加了特殊的字符类,如[:alnum:]是[A-Za-z0-9]的另一个写法。
要把它们放到[]号内才能成为正则表达式,如[A-Za-z0-9] 或[[:alnum:]]。在Linux下的grep 除fgrep 外,都支持 POSIX的字符类。
练习:
1、显示/proc/meminfo文件中以大小s开头的行(要求:使用两
种方法)
cat /proc/meminfo|grep “^[Ss]”
cat /proc/meminfo|grep -i “^s”
cat /proc/meminfo|grep -e ^s -e ^S
cat /proc/meminfo|grep “^s|^S”
cat /proc/meminfo|grep “^[s|S]”
2、显示/etc/passwd文件中不以/bin/bash结尾的行
[root@localhost ~]# cat /etc/passwd|grep -v “/bin/bash\b”
[root@localhost ~]# grep -v “/bin/bash$” /etc/passwd
3、显示用户rpc默认的shell程序
[root@localhost ~]# grep “rpc>” /etc/passwd|cut -d: -f7
[root@localhost ~]# grep -w “rpc” /etc/passwd|cut -d: -f7
4、找出/etc/passwd中的两位或三位数
[root@localhost ~]# grep “\<[0-9]{2,3}>” /etc/passwd
5、显示CentOS7的/etc/grub2.cfg文件中,至少以一个空白
字符开头的且后面存非空白字符的行
[root@localhost ~]# cat /etc/grub2.cfg|grep “^[[:space:]+ [^[:space:]]”