Linux文本处理工具与正则表达式详解

1.文本编辑介绍

Linux文本处理工具:

nano  #字符工具,全屏显示
gedit #图形化工具,全屏显示
vi    #文本编辑器,centos最小化安装自带
vim   #从vi发展来的文本编辑器,有插入模式、命令模式、扩展模式
cat   #可查看文本内容
tac   #逆向显示文本内容
nl	  #文本查看,显示行号   
rev   #将同一行内容逆向显示
hexdump #查看非文本文件内容,显示ASCII,decimal,hexadecimal,octal
od    #输出文件八进制和其他格式
xxd   #生成hexdump或相反的
more  #类似 cat ,以一页一页的形式显示
less  #less 与 more 类似,less 可以随意浏览文件,支持翻页和搜索,支持向上翻页和向下翻页
head  #可用于查看文件的开头部分的内容,有一个常用的参数 -n 用于显示行数,默认为 10,即显示 10 行的内容
tail  #可用于查看文件的内容,有一个常用的参数 -f 常用于查阅正在改变的日志文件
cut   #显示每行从开头算起 num1 到 num2 的文字
paste #用于合并文件的列
wc    #用于计算字数
sort  #用于将文本文件内容加以排序
uniq  #用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用
diff  #用于比较文件的差异
patch #用于修补文件
cmp   #用于比较两个文件是否有差异
grep  #用于查找文件里符合条件的字符串
sed   #利用脚本来处理文本文件
awk   #一种处理文本文件的语言,是一个强大的文本分析工具

2.正则表达式

正则表达式,regular expressions,由一类特殊字符及文本字符所编写的模式,其中字符表示控制或通配的功能。

  • 通配符功能是用来处理文件名

  • 正则表达式是处理文本内容中字符

字符匹配:

.   匹配任意单个字符,可以是一个汉字
[]  匹配指定范围内的任意单个字符
[^] 匹配指定范围外的任意单个字符
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符
[:lower:] 小写字母
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符
[:cntrl:] 不可打印的控制符(退格,删除等)
[:digit:] 十进制数字
[:xdigit:] 十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号

匹配次数:

*     匹配前面的字符任意次
.*    任意长度的任意字符
?     匹配前面字符0或1次
+     匹配其前面的字符至少1次
{n}   匹配前面的字符n次
{m,n} 匹配前面的字符至少m次,至多n次
{,m}  匹配前面的字符至多m次
{n,}  匹配前面的字符至少n次

位置锚定:

^ 行首锚定
$ 行尾锚定
^PATTERN$ 用于模式匹配整行 
^$ 空行
^[[:space:]]*$ 空白行
\< 或 \b 词首锚定
\> 或 \b 词尾锚定
<PATTERN> 匹配整个单词

3.常用编辑工具

  • grep 更适合单纯的查找或匹配文本

  • sed 更适合编辑匹配到的文本

  • awk 更适合格式化文本,对文本进行较复杂格式处理

3.1vim工具应用

vim三种模式:

  • 命令模式:command mode

敲键盘动作会被识别为命令,而非输入字符。

i 切换到输入模式,以输入字符

x 删除当前光标所在处的字符

dd 删除光标所在整行

:切换到底线命令模式,以在最低一行输入命令

  • 输入模式:insert mode

  • 底线命令模式:last line mode

一般模式常用按键说明:

#移动光标
ctrl+f 向下移动一页
ctrl+b 向上移动一页
0或Home 移动到行的最前面字符处
$或End  移动到行的最后面字符处
G  移动到最后一行
gg 移动到第一行
n<Enter> n为数字,向下移动n行
#搜索替换
/word  向光标之下搜索word字符串
?word  向光标之上搜索word字符串
n 重复前一个搜索动作
N 反向重复前一个搜索动作
:n1,n2 s/word1/word2/g 在n1到n2行之间查找word1并替换为word2
:1,$ s/word1/word2/g (:% s/word1/word2/g) 从第一行到最后一行搜索word1,并取代为word2
#删除复制黏贴
dd  删除光标所在的一整行
ndd n为数字,删除光标所在向下n行
d1G 删除光标所在到第一行的所有数据
d$ 删除光标到最后一行字符
yy 复制光标所在一行
nyy 复制光标所在向下n行

vim环境变量

:set nu   显示行号
:set nonu 取消行号

3.2grep工具应用

grep, egrep, fgrep - print lines matching a pattern

grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

#参数
-a
-b
-c 计算符合样式的列数
-d 当指定要查找的是目录而非文件时,必须使用该参数
-e 
-E 将样式作为扩展正则表达式使用
-f 指定规则文件
-i 忽略字符大小写
-n 在显示符合行之前,标识出该行的列数编号
-v 显示不包含匹配文本的所有行

3.2sed工具应用

sed - stream editor for filtering and transforming text

sed [OPTION]... {script-only-if-no-other-script} [input-file]...

#参数说明
-e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件
-f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件
-h或--help 显示帮助
-n或--quiet或--silent 仅显示script处理后的结果
-V或--version 显示版本信息

#动作说明
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
s :取代,可以直接进行取代的工作!通常这个 s 的动作可以搭配正则表达式!例如 1,20s/old/new/g 就是啦!

实例:

#新增行(追加、插入)
[root@CentOS7 data]# head passwd  | sed -e '2i mabang' #第二行前插入行“mabang”
root:x:0:0:root:/root:/bin/bash
mabang
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@CentOS7 data]# head passwd  | sed -e '2a mabang' #第二行后追加行“mabang”
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
mabang
daemon:x:2:2:daemon:/sbin:/sbin/nologin
#删除行
[root@CentOS7 data]# nl passwd | sed -e '2,4d'         #删除第2到4行
     1	root:x:0:0:root:/root:/bin/bash
     5	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6	sync:x:5:0:sync:/sbin:/bin/sync
#替换行
[root@CentOS7 data]# nl passwd | sed -e '2,4c magedu'  #第2到4行替换为“magedu”
     1	root:x:0:0:root:/root:/bin/bash
magedu
     5	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6	sync:x:5:0:sync:/sbin:/bin/sync
#数据搜索并显示
[root@CentOS7 data]# nl passwd | sed -n '/root/p'      #匹配搜索并显示行
     1	root:x:0:0:root:/root:/bin/bash
    10	operator:x:11:0:operator:/root:/sbin/nologin
#数据搜索并删除
[root@CentOS7 data]# nl passwd | sed -e '/root/d'	   #删除匹配到的行
     2	bin:x:1:1:bin:/bin:/sbin/nologin
     3	daemon:x:2:2:daemon:/sbin:/sbin/nologin
#数据搜索并执行命令
[root@CentOS7 data]# nl passwd | sed -e '/root/{s/bash/csh/;q}'  #匹配到并执行{}中命令
     1	root:x:0:0:root:/root:/bin/csh
#数据搜索并替换
[root@CentOS7 data]# nl passwd | sed -e 's/root/MAGE/g'  #搜索并替换
     1	MAGE:x:0:0:MAGE:/MAGE:/bin/bash
     2	bin:x:1:1:bin:/bin:/sbin/nologin
#多点编辑
[root@CentOS7 data]# nl passwd | sed -e 's/bash/csh/' -e '4,$d'  #替换并删除
     1	root:x:0:0:root:/root:/bin/csh
     2	bin:x:1:1:bin:/bin:/sbin/nologin
     3	daemon:x:2:2:daemon:/sbin:/sbin/nologin
#直接修改文件内容(慎重执行)
[root@CentOS7 data]# sed -i '$a #hi mage' passwd   #-i选项修改原文件,末尾追加内容
[root@CentOS7 data]# tail passwd 
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin
mandriva:x:1005:2019::/home/mandriva:/bin/bash
mageia:x:1100:1100::/home/linux:/bin/bash
slackware:x:2002:2019::/home/slackware:/bin/tcsh
user1:x:2003:2003::/home/user1:/bin/bash
user2:x:2004:2004::/home/user2:/bin/bash
user3:x:2005:2005::/home/user3:/bin/bash
#hi mage

3.3awk工具应用

awk - pattern scanning and processing language

Usage: awk [POSIX or GNU style options] -f progfile [--] file ...
Usage: awk [POSIX or GNU style options] [--] 'program' file ...

awk脚本
BEGIN{执行前的语句,一般做表头}
{处理匹配的每一行要执行的语句}
END{处理完所有行后要执行的语句,一般做统计结果}

选项参数:

-F 指定输入文件分隔符
-v 复制一个用户定义变量
-f 从脚本文件中读取awk命令

內建变量:

$n			  #当前记录的第n个字段,字段见有FS分隔
$0            #完整的输入记录
ARGC          #命令行参数的数目
ARGIND        #命令行中当前文件的位置(从0开始算)
ARGV          #包含命令行参数的数组
CONVFMT       #数字转换格式
ERRNO		  #最后一个系统错误的描述
FIELDWIDTHS   #字段宽度列表(用空格键分割)
FILENAME	  #当前文件名
FNR			  #各文件分别计数的行号
FS            #字段分隔符(默认任何空格)  Field Separator
IGNORECASE	  #如果为真,则进行忽略大小写的匹配
NF            #一条记录的字段的数目   Number for Field
NR            #已经读出的记录数,即行号,从1开始  Number of Record
OFMT          #数字的输出格式(默认值为%.6g)
OFS           #输出字段分隔符,默认值与输入字段分隔符一致  Out of Field Separator
ORS           #输出记录分隔符   Output Record Separate
RLENGTH       #由Match函数所匹配的字符串长度
RS            #记录分隔符(默认是换行符)  Record Separator
RSTART        #由Match函数所匹配的字符串的第一个位置
SUBSEP        #数组下标分隔符(默认值/034)

实例:

#使用正则,字符串匹配

#忽略大小写

#模式取反
上一篇:Linux 文件查看命令


下一篇:【linux】循序渐进学运维-cp