Linux文本处理工具
grep
正则表达式
扩展的正则表达式
VIM
抽取文本的工具
1.文件内容:less和cat
cat [OPTION]... [FILE]...
-n, --number
number all output lines
-E, --show-ends
display $ at end of each line
-A, --show-all
equivalent to -vET
more命令:分页查看文件
less命令:一页一页的查看文件
2.文件截取:head和tail
head - output the first part of files
-n, --lines=[-]K
print the first K lines instead of the first 10; with the leading '-', print all but the last K lines of each file
tail [OPTION]... [FILE]...
-f, --follow[={name|descriptor}]
3.按列抽取:cut
cut OPTION... [FILE]...
use DELIM instead of TAB for field delimite
fied
剪切passwd中的第一个和第三个字段,并按照第三个字段逆序排序
4.按关键字抽取:grep
grep, egrep, fgrep - print lines matching a pattern
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
-v, --invert-match
Invert the sense of matching, to select non-matching lines. (-v is specified by POSIX.)
-i, --ignore-case
Ignore case distinctions in both the PATTERN and the input files. (-i is specified by POSIX.)
-o, --only-matching
Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line.
Print NUM lines of trailing context after matching lines. Places a line containing a group separator (described
under --group-separator) between contiguous groups of matches. With the -o or --only-matching option, this has no
effect and a warning is given.
under --group-separator) between contiguous groups of matches. With the -o or --only-matching option, this has no
effect and a warning is given.
between contiguous groups of matches. With the -o or --only-matching option, this has no effect and a warning is
given.
正则表达式(REGEXP):由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或统配的功能
程序支持:grep、sed、awk、vim、less、nginx、varnish
分两类:
基本正则表达式:BRE
扩展正则表达式:ERE
元字符分类:字符匹配、匹配次数、位置锚定、分组及引用
man 7 regex
1.字符匹配
.:匹配任意单个字符
.*:匹配任意长度的任意字符
[]:匹配指定范围的任意单个字符
[^]:匹配指定范围外的任意单个字符
[:alnum:]:字母和数字
[:alpha:]:代表任何英文大小写字符
[:lower:]:小写字母
[:upper:]:大写字母
[:blank:]:空白字符
[:space:]:水平和垂直的空白字符
[:digit:]:十进制数字
[:punct:]:标点符号
2.匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数
*:匹配前面的字符任意次,包括0次
贪婪模式:尽可能长的匹配
\?:匹配其前面的字符0次或1次
\+:匹配其前面的字符至少1次
\{n\}:匹配前面的字符n次
\{m,n\}:匹配前面的字符至少mci,最多n次
\{,n\}:匹配其前面额字符最多n次
\{n,\}:匹配其前面的字符至少n次
[root@localhost ~]# cat > google.txt<<EOF
> google
> gooooooooooooooooooogle
> gogle
> ggle
> gooooooooo000000000gle
> EOF
grep "go.gle" google.txt
grep "go.*gle" google.txt
google
gooooooooooooooooooogle
gogle
gooooooooo000000000gle
grep "go*gle" google.txt
google
gooooooooooooooooooogle
gogle
ggle
grep "go\?gle" google.txt
gogle
ggle
grep "go\+gle" google.txt
google
gooooooooooooooooooogle
gogle
grep "go\{0\}gle" google.txt
ggle
3.位置锚定
^ 行首锚定,用于模式的最左侧
$行尾锚定,用于模式的最右侧
^PATTERN$:用于匹配整行
^$ 空行
^[[:space:]]$ 空白行
过滤空行
grep -v ^[[:space:]*]$
\<或\b 词首锚定,用于单词模式的左侧
\>或\b 词尾锚定,用于单词模式的右侧
\<PATTERN\> 匹配整个单词
4.分组及引用
分组:\(\)将一个或多个字符捆绑在一起,当作一个整体进行处理,如:\(root\)\+
分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为:\1 ,\2 ,\3,......
\1表示从左侧第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符
示例:\(string1\+\(string2\)*\)
\1:string1\+\(string2\)*
\2:string2
后向引用:引用前面的分组括号中的模式所匹配字符,而非模式本身
He loves his lover.
He likes his lover.
She likes her liker.
She loves her liker.
grep -E "(l..e).*\1" f1
或:\|
示例:a\|b:a或b C\|cat:C或者cat
\(C\|c\)at:Cat或cat
扩展的正则表达式
1.匹配次数
*:匹配前面的字符任意次
?:匹配前面的字符0次或1次
+:匹配前面的字符1次或多次
{m}:匹配m次
{m,n}:至少m次,最多n次
2.位置锚定
^:行首
$:行尾
\<、\b:词首
\>、\b:词尾
3.分组
()
后向引用:\1 \2 \3
或者:C|cat————C或cat
(C|c)at——Cat或cat
练习题
1.显示/etc/meminfo文件中以大小s开头的行(要求:使用两种方法)
2.显示/etc/passwd文件中不以/bin/bash结尾的行
3.显示用户rpc默认的shell程序
4.找出/etc/passwd中的两位或三位数
5.显示Centos7的/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面有非空白字符的行
6.找出“netstat-tan”命令结果中以LISTEN后跟任意多个空白字符结尾的行
7.显示Centos7上所有系统用户的用户名和UID
8.添加用户bash、testbash、basher、sh、nologin(其shell为/sbin/nologin),找出/etc/psswd用户名和shell同名的行
9.利用df和grep,取出磁盘各分区利用率,并从大到小排序
分析文本的工具
1.文本数据统计:wc
wc - print newline, word, and byte counts for each file
wc [OPTION]... [FILE]...
-c, --bytes
print the byte counts
print the character counts
print the word counts
2.整理文本:sort
sort - sort lines of text files
sort [OPTION]... [FILE]...
-n, --numeric-sort
compare according to string numerical value
-r, --reverse
reverse the result of comparisons
-t, --field-separator=SEP
use SEP instead of non-blank to blank transition
-k, --key=KEYDEF
sort via a key; KEYDEF gives location and type
uniq - report or omit repeated lines
uniq [OPTION]... [INPUT [OUTPUT]]
prefix lines by the number of occurrences
only print duplicate lines, one for each group
only print unique lines
3.比较文件:diff和patch
diff - compare files line by line
diff [OPTION]... FILES
-u, -U NUM, --unified[=NUM]
output NUM (default 3) lines of unified context
diff -u hjm.conf hjm2.conf > foo.patch
patch -b foo.conf foo.patch
VIM
模式转换
1.命令模式--------->插入模式
i:insert,在光标所在处输入
I:在当前光标所在行的行首输入
a:append,在光标所在处的后面输入
A:在当前光标所在处的行尾输入
o:在当前光标所在行的下方打开一个新行
O:在当前光标所在处的上方打开一个新行
插入模式-------------->命令模式
ESC
命令模式--------------->扩展命令模式
:
扩展命令模式----------->命令模式
ESC
2.关闭文件
:q:退出
:q!:强制退出,丢弃做出的修改
:wq:保存退出
扩展模式
按“:”进入扩展模式
命令:
:w 写(存入)磁盘文件
:q 退出
:r filename 读文件内容到当前文件中
:w filename 将文件内容写入到另一个文件
:!command 执行命令
:r!command 读入命令的输出
命令模式光标跳转
单词间跳转:
w:下一个单词的词首
e:当前或下一个单词的词尾
b:当前或钱一个单词的词首
#COMMAND:由#指定一次跳转的单词数
行首行尾跳转:
^:跳转至行首的第一个非空白字符
0:跳转至行首
$:跳转至行尾
行间移动:
#G:跳转至由#指定行
G:最后一行
gg:第一行
命令模式操作:
字符编辑:
x:删除光标处的字符
#x:删除光标处起的#个字符
p:粘贴到光标所在处的后面
xp:交换光标所在处的字符及其后面字符的位置
~:转换大小写
J:删除当前行的后的换行符
替换命令(r,replace)
r:替换光标所在处的字符
R:切换成REPLACE模式(替换模式)
删除命令:
d:删除命令,可结合光标跳转字符,实现范围删除
d$ d^ d0 dw de db dG dgg
#COMMAND
dd:删除光标所在的行
#dd:多行删除
复制命令(y,yank):
y:复制,行为类似于d命令
yy:复制行
#yy:复制多行
粘贴命令(p,paste)
p:缓冲区存的如果为整行,则粘贴当前光标所在行的下方;否则,粘贴至当前光标所在处的后面
P:缓冲区存的如果为整行,则粘贴在当前光标所在行的上方;否则,粘贴至当前光标所在处的前面
改变命令(c,change)
c:修改后切换到插入模式
命令模式-->插入模式
行为于d命令相似 c$ c^等
cc:删除当前行并输入新内容
扩展命令模式
扩展命令模式:查找
/PATTERN:从当前光标所在处向文件尾部查找
?PATTERN:从当前光标所在处向文件首部查找
n:与命令同方向
N:与命令反方向
扩展命令模式:地址定界
:start_pos,end_pos
#:具体第#行
#,#:从第几行到第几行
%:表示全文 %s#/etc#/var#g 全文都替换
扩展命令模式:查找并替换
s:在扩展模式下完成查找替换操作
格式:s/要查找的内容/替换为的内容/修饰符
要查找的内容:可使用PATTERN
替换为的内容:不能使用PATTERN,但可以使用\1 \2等后向引用符号
修饰符:
i:忽略大小写
g:全局替换;默认情况下,每一行只替换第一次出现
gc:全局替换,每次替换前询问
查找替换中的分隔符/可替换为其它字符,如:
s@/etc@/var@g
s#/etc/#/var#g