Linux的文本内容检索-处理
Linux的文本内容检索-处理
制作人:全心全意
文本查找
grep:搜索以文件输入(或者是标准输入,如果没有指定文件名,或者给出的文件名是-的话),寻找含有与给定的模式 PATTERN相匹配的内容的行。默认情况下, grep将把含有匹配内容的行打印出来。另外,也可以使用两个变种程序 egrep 和 fgrep 。 Egrep与 grep -E 相同。 Fgrep 与 grep -F 相同。
用法:
grep [选项] 模式 [文件...]
grep [选项] [-e 模式 | -f 文件] [文件...]
-i:忽略大小写
--color:匹配到的字符串高亮显示
-v:反向查找
-o:仅显示匹配到的字符串本身,不显示行内没有匹配到的内容
-E:使用扩展正则表达式,可使用egrep代替
-A:指定显示匹配行后面多少行
-B:指定显示匹配行前面多少行
-C:指定显示匹配行前面和后面多少行
模式:文本字符和正则表达式元字符组合而成
注:正则的的特殊字符的含义
.:匹配任意单个字符
[]:匹配指定范围内的单个字符
字符集合:
[:digit:]:数字
[:lower:]:小写字母
[:upper:]:大写字母
[:punct:]:标点符号
[:space:]:空白字符
[:alpha:]:所有字符
[:alnum:]:所有数字和字母
[^]:匹配指定范围外的单个字符
*:表示匹配前面的字符任意次
\?:表示匹配前面的字符0次或1次
\{m,n\}:表示匹配前面的字符最少m次,最多n次
\{1,\}:最少1次,多了不限
\{0,3\}:最少0次,最多3次
\<:其后面的任意字符必须作为单词首部出现(单词可以包含数字、字母)
\>:其前面的任何字符必须作为单词尾部出现
\<和\>都可以使用\b代替
^:行首
$:行尾
\(\):分组,例如\(ab\)*中将ab看做一个整体,多用于后向引用,后向引用使用\1、\2分别调用
#查找/etc/passwd文件中包含root的行 [root@localhost ~]# grep 'root' /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin #查找/etc/inittab文件中以数字为结尾的行 [root@localhost ~]# grep '[[:digit:]]$' /etc/inittab # multi-user.target: analogous to runlevel 3 # graphical.target: analogous to runlevel 5
#分组的使用 #查找tt.txt文件中分组匹配到like,后面依旧是前面匹配到的内容 [root@localhost ~]# cat tt.txt The like is liker. The like is lover. [root@localhost ~]# grep '\(l..e\).*\1' tt.txt The like is liker.
流编辑器
sed:用于过滤和转换文本的流编辑器
用法:sed [选项]... {地址编辑命令(脚本)} [输入文件]...
地址:
起始行,结束行:1,100为第1到100行,$表示最后一行
/模式(正则)/:匹配到的行
/模式1/,/模式2/:第1次匹配模式1的行开始到第1次匹配模式2的行结束中间的所有行
精确的行:5为第五行
起始行,+N:从起始行开始向后N行
编辑命令:
d:删除符合条件的行
p:显示符合条件的行,不使用-n,输出效果不好
a \string:在指定的行后面增加新行,内容为string
i \string:在指定的行前面增加新行,内容为string
r FILE:将指定的文件的内容添加至符合条件行的后面
w FILE:将指定范围内的内容另存至指定的文件中
s/模式/string/:查找匹配模式的字符串并替换为指定的string,分隔符///可以使用其他的代替,例如###
g:全局替换,默认只替换每行第一个
i:忽略字符大小写
&:在string中表示引用模式匹配的整个串
y/字符集1/字符集2/:将字符集1中的字符替换为字符集2中对应的字符
-n:静默模式,不再默认显示模式空间内容
-i:直接修改原文件
-e:同时指定多个地址编辑命令(格式为sed -e 脚本 -e 脚本 -e 脚本...)
-f FILE:文件中为脚本命令,每一行为一个脚本,然后依次使用脚本对文件进行处理
-r:使用扩展正则表达式,默认只支持基本正则表达式
工作模式:逐行读取文本,将符合条件的文本行读取到内存空间(模式空间),而后使用编辑命令进行编辑,将结果显示到屏幕,默认对源文件不进行任何处理,处理的仅是模式空间读取过来的副本。
#sed中替换可以使用分组 [root@localhost ~]# cat 5.txt I like you I love you #将l..e中的L换成大写 [root@localhost ~]# sed 's/l\(..e\)/L\1/' 5.txt I Like you I Love you #使用&进行引用整个串 [root@localhost ~]# sed 's/l..e/&r/' 5.txt I liker you I lover you
[root@master tt]# cat 1.txt 11 2 3 #使用字符转换1.txt中的字符 [root@master tt]# sed 'y/123/abc/' 1.txt aa b c #使用w将指定范围内的内容写入文件 [root@master tt]# sed -n '1,2 w output' 1.txt [root@master tt]# cat output 11 2
报告生成器
awk:根据输入的信息,将所输入的信息格式化后进行输出。进行过一次更新,下载Linux下使用的是gawk。
用法:
awk [选项] ‘脚本’ 文件1,文件2...
awk [选项] ‘模式 { 动作 }’ 文件1,文件2...
-F:指定分隔符,默认使用空格作为分隔符,分隔后使用$1/$2/$3...调用,$0表示整行内容
-v:定义awk变量
模式:
正则表达式,格式为/表达式/
[root@localhost ~]# awk -F: '/^r/{print $1}' /etc/passwd root rpc rtkit
表达式
#显示UID为0的用户名 [root@localhost ~]# awk -F: '$3 == 0 {print $1}' /etc/passwd root #第7个字段是否与模式匹配 [root@localhost ~]# awk -F: '$7~"bash$" {print $1}' /etc/passwd root zq
指定范围,格式为模式1,模式2,模式1开始,模式2结束,模式建议使用表达式,测试时正则出现异常
BEGIN/END:特殊模式,仅在awk命令执行前运行一次或结束前运行一次
[root@localhost ~]# awk 'BEGIN{print "开始"} {print $1,$4} END{ print "结束" }' 1.txt 开始 My quanxinquanyi. This text. 结束
Empty(空模式):文件的每一行都做处理,模式什么也不写,直接写动作命令
[root@localhost ~]# awk '{print $1,$4}' 1.txt My quanxinquanyi. This text.
awk的内置变量
FS:指定输入内容的分隔符,默认是空白字符,等同于选项-F
RS:指定输入内容的换行符,默认是换行符
OFS:指定输出内容的分隔符,默认是空白字符
ORS:指定输出内容的换行符,默认是换行符
awk的内置数据变量
NR:相对于所有文件,awk命令所处理的行数
NF:当前行的字段个数
FNR:相对于当前处理的文件,awk命令所处理的行数,在指定多个文件时使用
awk用户自定义变量
gawk允许用户自定义自己的变量,以便在程序代码中使用,变量名命名规则与大多数编程语言相同,只能使用字母、数字和下划线,切不能以数字开头,gawk变量名称区分字符大小写。
#用户自定义变量 [root@localhost ~]# awk 'BEGIN{ tt="test"; print tt}' test #使用选项用户自定义变量 [root@localhost ~]# awk -v tt="test" BEGIN'{print tt}' test
动作:
print:输出内容,多个内容使用逗号分隔
printf:自定义格式化输出内容,不会自动打印换行符
用法:printf 格式 内容1,内容2...
格式:格式之间不需要使用逗号进行分隔
%c:显示字符的ASCII码
%d,%i:十进制的整数
%e,%E:科学计数法显示数值
%f:显示浮点数
%g,%G:以科学计数法的格式或浮点数的格式显示数值
%s:显示字符串
%u:无符号整数
%%:显示%号自身
修饰符:修饰符在格式中使用,例如(%-c、%+d)
N:显示宽度,N为数字
-:左对齐
+:显示数值符号
#以10个字符作为宽度,默认右对齐 [root@localhost ~]# awk '{printf "%10s\n",$1}' 1.txt My This #以10个字符作为宽度,使用左对齐 [root@localhost ~]# awk '{printf "%10-s\n",$1}' 1.txt My This
#显示用户名和UID,用户名以20个字符显示并且左对齐,UID以5个字符显示,默认对齐 #格式之间无需使用分隔符 [root@localhost ~]# awk -F: '{printf "%-20s%5d\n",$1,$3}' /etc/passwd root 0 bin 1 daemon 2 ......
表达式
控制语句:if、if-else、while、do-while、for、case、break和continue、next(提前结束此行的处理,进入下一行)
#判断用户名是否为root,root为管理员,否则为普通用户 [root@localhost ~]# awk -F: '{if ($1=="root") print $1,"管理员";else print $1,"普通用户"}' /etc/passwd root 管理员 bin 普通用户 daemon 普通用户
#输出/etc/中字段的字符个数大于等于4的字段 [root@bogon ~]# awk -F: '{i=1;while(i<=NF){if (length($i) >= 4) print $i;i++}}' /etc/passwd root root
#统计默认shell分别使用的用户数 #awk中数组的下边可以使用字符串,不指定值默认为1,for循环中A的值为数组的下标 [root@bogon ~]# awk -F: '{shell[$NF]++}END{for(A in shell) {print A,shell[A]}}' /etc/passwd /bin/sync 1 /bin/bash 2 /sbin/nologin 38 /sbin/halt 1 /sbin/shutdown 1
输入输出语句
awk的操作符
算术操作符:
**:次方
*:乘法
/:除法
+:加法
-:减法
%:取余
赋值操作符:
=、+=、-=、*=、/=、%=、^=、**=、++、--
注意:如果某模式为*号,此时使用/*/可能会有语法错误,应以/[*]/替代
比较操作符:
<、>、<=、>=、==、!=、
x ~ y:x为字符串,y为模式,y模式可以匹配x为真
x !~ y:y模式不可以匹配x为真
逻辑关系符
&&、||
条件表达式
三目运算符:条件?值1:值2
awk的内置函数
length([string]):返回string字符串中的字符个数
cut:在文件的每一行中提取片断
用法:cut [选项] [文件]
-d,--delimiter:指定字段分隔符,默认使用TAB键作为分隔符(非空格)
-f,--fields:指定输出的字段
[root@slave2 ~]# cat 1.txt 123 345 456 567 #指定空格为分隔符,输出第2个字段 [root@slave2 ~]# cut -d" " -f2 1.txt 345 #输出第1到3个字段 [root@slave2 ~]# cut -d" " -f1-3 1.txt 123 345 456 #输出第1和第4个字段 [root@slave2 ~]# cut -d" " -f1,4 1.txt 123 567
文本排序
sort:对文本文件的行进行排序,默认根据升序进行排序,标准是首个字符在ASCII码表中的位置
用法:sort [选项] [文件]
-b:忽略行首的空格
-n:按照数值大小排序,暗含-b
-r:颠倒默认的排序,也就是降序
-o:将排序结果输出到指定文件
-t:指定字段分隔符
-k:指定排序的字段
-u:对排序后重复的行进行去重,对应命令uniq(必须排序后使用,去重时相同的行必须相邻)
-f:排序时忽略字符大小写
#根据UID对文件进行数值排序 [root@slave2 ~]# sort -n -t: -k3 /etc/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 ......
uniq:删除排序文件中的重复行,与sort结合使用(必须排序后使用,去重时相同的行必须相邻)
用法:uniq [选项] 输入流
-d:仅显示重复的行
-D:显示所有重复的行
-c:显示每一行重复的次数
[root@slave2 ~]# cat 1.txt 123 234 123 456 456 #对重复的行进行去重 [root@slave2 ~]# sort -n 1.txt | uniq 123 234 456 #统计排序后重复的行的次数 [root@slave2 ~]# sort -n 1.txt | uniq -c 2 123 1 234 2 456 #仅显示重复的行 [root@slave2 ~]# sort -n 1.txt | uniq -d 123 456
文本统计
wc:输出文件中的行数、单词数、字节数
用法:wc [选项] [输入流]
-l:显示行数
-w:显示单词数
-c:显示字节数
-m:显示字符个数
-L:显示最长的一行包含多少个字符
[root@slave2 ~]# wc /etc/passwd 48 97 2519 /etc/passwd #48行 97的单词 2519个字节
字符处理
tr:转换或删除字符(不能指定文件,可以使用输入重定向或管道)
用法:tr [选项] 字符集1 [字符集2]
-d:删除指定字符集中的字符
#对输入字符进行字符集对应替换 [root@slave2 ~]# echo "abc" | tr 'ab' 'AB' ABc
[root@slave2 ~]# cat 1.txt acz #将1.txt中小写字母全部转换为大写字母 [root@slave2 ~]# tr 'a-z' 'A-Z' < 1.txt ACZ #删除输入中指定字符集中包含的字符 [root@slave2 ~]# tr -d 'c' < 1.txt az
文本合并
paste:合并文件各行
用法:paste [选项] [文件]...
-d:指定分隔符
[root@slave1 zq20191114]# cat 1.txt 1 2 3 [root@slave1 zq20191114]# cat a.txt a b c #合并文件 [root@slave1 zq20191114]# paste 1.txt a.txt 1 a 2 b 3 c #合并文件,使用:作为分隔符 [root@slave1 zq20191114]# paste -d: 1.txt a.txt 1:a 2:b 3:c
文件分割
split:分割文件
用法:split [选项] 文件 输出文件前缀
-l:指定按行分割,不可对二进制文件使用
-b:指定按文件大小分割
[root@slave1 tt]# cat 2.txt 1 2 3 #指定按行分割文件,每一行分割为1个文件 [root@slave1 tt]# split -l 1 2.txt test_ [root@slave1 tt]# ll 总用量 16 -rw-r--r-- 1 root root 6 5月 21 17:35 2.txt -rw-r--r-- 1 root root 2 5月 21 17:35 test_aa -rw-r--r-- 1 root root 2 5月 21 17:35 test_ab -rw-r--r-- 1 root root 2 5月 21 17:35 test_ac #=========================== [root@master tt]# du -sh bash 940K bash #指定按大小分割文件,每500K分割为1个文件 [root@master tt]# split -b 500K bash base_ [root@master tt]# ll 总用量 1880 -rw-r--r-- 1 root root 512000 5月 21 17:38 base_aa -rw-r--r-- 1 root root 448392 5月 21 17:38 base_ab -rwxr-xr-x 1 root root 960392 5月 21 17:38 bash