Bootstrap

文本处理及正则表达式grep,vim

文本处理及正则表达式

文件查看

文件查看命令:
cat,tac,rev
cat [OPTION]… [FILE]…

cat
-E:显示行结束符$  
-n:对显示出的每一行进行编号  
-A:显示所有控制符  
-b:非空行编号  
-s:压缩连续的空行成一行  

tac 与cat相反
rev
文件查看
more: 分页查看文件

more [OPTIONS...] FILE...  
-d: 显示翻页及退出提示  
less:一页一页地查看文件或STDIN输出  

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

显示文本前或后行内容*******************************(重点)

head [OPTION]… [FILE]…

head
-c #: 指定获取前#字节  
-n #: 指定获取前#行  
-#:指定行数  
tail [OPTION]... [FILE]...  
-c #: 指定获取后#字节  
-n #: 指定获取后#行  
-#:同上  
-f: 跟踪显示文件fd新追加的内容,常用日志监控  
相当于--follow=descriptor  
-F: 跟踪文件名,相当于--follow=name --retry  
tailf类似tail –f,当文件不增长时并不访问文件  

按列抽取文本cut和合并文件paste*********************CUT

cut [OPTION]… [FILE]…

cut
-d DELIMITER: 指明分隔符,默认tab  
-f FILEDS:  
#: 第#个字段  
#,#[,#]:离散的多个字段,例如1,3,6  
#-#:连续的多个字段, 例如1-6  

混合使用:1-3,7
-c按字符切割
–output-delimiter=STRING指定输出分隔符
cut和paste
显示文件或STDIN数据的指定列

cut -d:-f1 /etc/passwd  
cat /etc/passwd|cut -d: -f7  
cut -c2-5/usr/share/dict/words  

paste 合并两个文件同行号的列到一行

paste [OPTION]... [FILE]...  
-d 分隔符:指定分隔符,默认用TAB  
-s : 所有行合成一行显示  
示例:  
paste f1 f2  
paste -s f1 f2

收集文本统计数据wc*****************************************WC

计数单词总数、行总数、字节总数和字符总数
可以对文件或STDIN中的数据运行
wcstory.txt
392371901story.txt
行数字数字节数
常用选项

wc
-l    只计数行数  
-w    只计数单词总数  
-c    只计数字节总数  
-m    只计数字符总数  
-L    显示文件中最长行的长度  

文本排序sort

把整理过的文本显示在STDOUT,不改变原始文件
sort[options]file(s)
常用选项

sort
-r执行反方向(由上至下)整理
-R随机排序  
-n执行按数字大小整理  
-f选项忽略(fold)字符串中的字符大小写  
-u选项(独特,unique)删除输出中的重复行  
-t c选项使用c做为字段界定符  
-k X选项按照使用c字符分隔的X列来整理能够使用多次  

uniq

uniq命令:从输入中删除前后相接的重复的行
uniq[OPTION]… [FILE]…

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

比较文件

比较两个文件之间的区别

difffoo.conffoo2.conf  
5c5 
< use_widgets=no
>use_widgets=yes          #注明第5行有区别(改变)

取出IP地址的几种方法**********(重点)

ifconfig | sed -r '2!d;s/.*inet (addr:)?//;s/ .*//'   #6和7通用的取出IP地址    
ifconfig eth0 | head -2|tail -1| tr -dc '[0-9]. ' |tr -s ' ' |cut -d" " -f2   #centos6系统上  
ifconfig eth0|sed -n '2p'|sed 's@.*inet @@'|sed 's@ netmask.$@@' #提取出7上的IP地址,其中@@为分隔符  
ifconfig ens33|sed -nr '2s/.*t (.*) net.*/\1/gp' #扩展的正则表达式取出IP,()为分组,只有一个括号,所以后面写1  
ifconfig ens33|sed -nr '2s/(.*t) (.*)( net.*)/\2/gp' #扩展的正则表达式取出IP,()为分组,有三个括号,所以后面写2留第二个  
ifconfig | sed -nr "s/.inet (.*) netmask.*/\1/p" | head -n 1   #取出7的IP  
ifconfig | sed -nr "s/.inet (.*) netmask.*/\1/p" #取出7的三个网卡IP  

查询系统信息 *****************重点

#RED is content color  
RED="\033[1;31m"  
COLOREND="\033[0m"  
echo -e "OS version is $RED`cat /etc/centos-release`$COLOREND"  #显示系统版本 
echo -e "kernel version $RED`uname -r`$COLOREND"    #显示内核版本 
echo -e "The cpu type is $RED`lscpu |egrep -i 'model name'|tr -s ' '|cut -d: -f2`$COLOREND"        #显示CPU型号 
echo -e "The memory is $RED`free -h|egrep Mem|tr -s ' ' ':' |cut -d: -f2`$COLOREND"           #取出内存大小  
echo -e "The max disk used is $RED`df |grep  /dev/sd|tr -s " " ":"|cut -d: -f5|sort -nr|head -1`$COLOREND"      #取出最大磁盘利用率
echo -e "The hostname is $RED$(hostname)$COLOREND"    #取出hostname 
echo -e "The ipaddr is $RED`ifconfig|head -2|tail -1|tr -s " " ":"|cut -d: -f3`$COLOREND"      #取出IP地址
unset RED COLOREND        #不使用颜色

Linux文本处理三剑客

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

grep**************************************(重点)

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

grep [OPTIONS] PATTERN [FILE...]  
grep root /etc/passwd  
grep "$USER" /etc/passwd  
grep '$USER' /etc/passwd  
grep `whoami` /etc/passwd  

grep命令选项

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,不支持正则表达式  
-ffile: 根据模式文件处理  

正则表达式*************************重点

REGEXP:Regular Expressions,由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能
程序支持:grep,sed,awk,vim, less,nginx,varnish等
分两类:
基本正则表达式:BRE
扩展正则表达式:ERE
grep -E, egrep
正则表达式引擎:
采用不同算法,检查处理正则表达式的软件模块
PCRE(Perl Compatible Regular Expressions)
元字符分类:字符匹配、匹配次数、位置锚定、分组
man 7 regex

基本正则表达式元字符

字符匹配:

. 匹配任意单个字符
[] 匹配指定范围内的任意单个字符,示例:[wang] [0-9] [a-z] [a-zA-Z]
[^] 匹配指定范围外的任意单个字符
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即A-Z, a-z
[:lower:] 小写字母[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:]水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃…)
[:digit:] 十进制数字[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号

通配符是通配的文件名

正则表达式是配的字符串,文件的内容
【wang】 匹配这四个字符其中的一个

grep "[123]" /etc/passwd     #查询passwd文件夹里包含123中一个数字的文件  
grep -v "[123]" /etc/passwd  #查询passwd文件夹里不包含123中一个数字的文件  
grep "[^123]" /etc/passwd   #查询passwd文件夹里除了123中一个数字的文件  

匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数

* 匹配前面的字符任意次,包括0次  
贪婪模式:尽可能长的匹配  
.*任意长度的任意字符  
\?匹配其前面的字符0或1次  
\+匹配其前面的字符至少1次  
\{n\}匹配前面的字符n次  
\{m,n\}匹配前面的字符至少m次,至多n次  
\{,n\}匹配前面的字符至多n次  
\{n,\}匹配前面的字符至少n次   

位置锚定:定位出现的位置

^ 行首锚定,用于模式的最左侧 grep “^bash” /etc/passwd
$ 行尾锚定,用于模式的最右侧 grep "bash &quot; / e t c / p a s s w d P A T T E R N &quot; /etc/passwd ^PATTERN "/etc/passwdPATTERN 用于模式匹配整行
^$ 空行
1$ 空白行
< 或\b词首锚定,用于单词模式的左侧(单词不能包含数字、_、其他字母开头)
> 或\b词尾锚定,用于单词模式的右侧
<PATTERN>匹配整个单词
**************************************************

正则表达式

分组:() 将一个或多个字符捆绑在一起,当作一个整体处理,如:(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
元字符

^ 行首
$行尾
.任意单一字符
[][]内任意单一字符
[^]除[]内任意单一字符
**前面字符重复不确定次数
++前面字符重复一次以上不确定次数
??前面字符重复0或1次
\转义符
.*任意长度字符
{n}前面字符重复n次
{n,}前面字符重复n次以上
{m,n}前面字符重复m次和n次之间
[:alnum:]字母和数字
[:alpha:]代表任何英文大小写字符,亦即A-Z, a-z
[:lower:]小写字母
[:upper:]大写字母
[:blank:]水平空白字符(空格和制表符)
[:space:]所有水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:]不可打印的控制字符(退格、删除、警铃…)
[:digit:]十进制数字
[:graph:]可打印的非空白字符
[:print:]可打印字符
[:punct:]标点符号
[:xdigit:]十六进制数字

egrep及扩展的正则表达式

egrep= grep -E
egrep[OPTIONS] PATTERN [FILE…]
扩展正则表达式的元字符:
字符匹配:

. 任意单个字符
[] 指定范围的字符
[^] 不在指定范围的字符
次数匹配:
*匹配前面字符任意次
?0或1次
+1次或多次
{m}匹配m次
{m,n}至少m,至多n次
位置锚定:
^行首
$行尾
<, \b语首
>, \b语尾
分组:()
后向引用:\1, \2, …
或者:
a|ba或b
C|catC或cat
(C|c)atCat或cat

vim简介*****************************重点

vim 编辑模式,行首批量加#,多行插入

ctrl +v用光标选定多行
按大写i,然后输入#,再按两次esc,添加#完成

esc模式
删除整行dd
H回到文章头部
shift+^回到光标行首
见PDF6中第32,68,69页图片
vi: Visual Interface,文本编辑器
文本:ASCII, Unicode
文本编辑种类:
行编辑器: sed
全屏编辑器:nano, vi
vim-Vi Improved

其他编辑器:
gedit一个简单的图形编辑器
gvim一个Vim编辑器的图形版本

打开文件

vim [OPTION]... FILE...  
+#打开文件后,让光标处于第#行的行首,+默认行尾  
+/PATTERN打开文件后,直接让光标处于第一个被PATTERN匹配到的行的行首  
–b file 二进制方式打开文件  
–d file1 file2… 比较多个文件  
-m file 只读打开文件  
ex file 或vim –e 直接进入ex模式  
如果该文件存在,文件被打开并显示内容  
如果该文件不存在,当编辑后第一次存盘时创建它  
模式转换  
命令模式--> 插入模式  
iinsert, 在光标所在处输入  
I在当前光标所在行的行首输入  
aappend, 在光标所在处后面输入  
A在当前光标所在行的行尾输入  
o在当前光标所在行的下方打开一个新行  
O在当前光标所在行的上方打开一个新行  

VIM模式的切换

插入模式--------> 命令模式
ESC
命令模式--------> 扩展命令模式
:
扩展命令模式--------> 命令模式
ESC,enter


扩展命令模式:

:q退出
:q!强制退出,丢弃做出的修改
:wq保存退出
:x保存退出
命令模式
ZZ保存退出
ZQ不保存退出

命令模式光标跳转
字符间跳转:
h: 左l: 右j: 下k: 上
.#COMMAND:跳转由#指定的个数的字符******************

单词间跳转:

w:下一个单词的词首
e:当前或下一单词的词尾
b:当前或前一个单词的词首
。#COMMAND:由#指定一次跳转的单词数
当前页跳转:
H:页首M:页中间行L:页底
zt:将光标所在当前行移到屏幕顶端
zz:将光标所在当前行移到屏幕中间
zb:将光标所在当前行移到屏幕底端
行首行尾跳转:
^: 跳转至行首的第一个非空白字符
0: 跳转至行首
$: 跳转至行尾
行间移动:
.#G、扩展命令模式下:# 跳转至由#指定行
G:最后一行
1G, gg: 第一行
句间移动:
):下一句(:上一句
段落间移动:
}:下一段{:上一段
命令模式翻屏操作
Ctrl+f: 向文件尾部翻一屏
Ctrl+b: 向文件首部翻一屏
Ctrl+d: 向文件尾部翻半屏
Ctrl+u:向文件首部翻半屏

命令模式操作

剪切和复制、粘贴
[n]x: 剪切光标右边n个字符,相当于d[n]l。
[n]X: 剪切光标左边n个字符,相当于d[n]h。
y: 复制在可视模式下选中的文本。
yy or Y: 复制整行文本。
y[n]w: 复制一(n)个词。
y[n]l: 复制光标右边1(n)个字符。
y[n]h: 复制光标左边1(n)个字符。
y$: 从光标当前位置复制到行尾。
y0: 从光标当前位置复制到行首。
:m,ny<cr> 复制m行到n行的内容。
y1G或ygg: 复制光标以上的所有行。
yG: 复制光标以下的所有行。
yaw和yas:复制一个词和复制一个句子,即使光标不在词首和句首也没关系。
d: 删除(剪切)在可视模式下选中的文本。
d$ or D: 删除(剪切)当前位置到行尾的内容。
d[n]w: 删除(剪切)1(n)个单词
d[n]l: 删除(剪切)光标右边1(n)个字符。
d[n]h: 删除(剪切)光标左边1(n)个字符。
d0: 删除(剪切)当前位置到行首的内容
[n] dd: 删除(剪切)1(n)行。
:m,nd<cr> 剪切m行到n行的内容。
d1G或dgg: 剪切光标以上的所有行。
dG: 剪切光标以下的所有行。
daw和das:剪切一个词和剪切一个句子,即使光标不在词首和句首也没关系。
d/f<cr>:这是一个比较高级的组合命令,它将删除当前位置 到下一个f之间的内容。
p: 在光标之后粘贴。
P: 在光标之前粘贴。
替换
:s/old/new - 用new替换当前行第一个old。
:s/old/new/g - 用new替换当前行所有的old。
:n1,n2s/old/new/g - 用new替换文件n1行到n2行所有的old。
:%s/old/new/g - 用new替换文件中所有的old。
:%s/^/xxx/g - 在每一行的行首插入xxx,^表示行首。
:%s/$/xxx/g - 在每一行的行尾插入xxx,$表示行尾。
所有替换命令末尾加上c,每个替换都将需要用户确认。 如:%s/old/new/gc,加上i则忽略大小写(ignore)。
还有一种比替换更灵活的方式,它是匹配到某个模式后执行某种命令,
语法为 :[range]g/pattern/command
例如 :%g/^ xyz/normal dd。
表示对于以一个空格和xyz开头的行执行normal模式下的dd命令。
关于range的规定为:

如果不指定range,则表示当前行。
m,n: 从m行到n行。
0: 最开始一行(可能是这样)。
$: 最后一行
.: 当前行
%: 所有行
di" 光标在”“之间,则删除”“之间的内容  
yi( 光标在()之间,则复制()之间的内容  
vi[ 光标在[]之间,则选中[]之间的内容  
dtx删除字符直到遇见光标之后的第一个x 字符  
ytx复制字符直到遇见光标之后的第一个x 字符  
扩展命令模式:地址定界********************按ESC进入命令模式,再按:进入扩展命令模式  

###地址定界

:start_pos,end_pos
# 具体第#行,例如2表示第2行#,# 从左侧#表示起始行,到右侧#表示结尾行
#,+# 从左侧#表示的起始行,加上右侧#表示的行数 :2,+3 表示2到5行 . 当前行 ‘ 最 后 一 行 . , ‘ ` 最后一行 .,` .,`-1 当前行到倒数第二行
% 全文, 相当于1,$
/pat1/,/pat2/
从第一次被pat1模式匹配到的行开始,一直到第一次被pat2匹配到的行结束
#,/pat/
/pat/,$
使用方式:后跟一个编辑命令
d
y
w file: 将范围内的行另存至指定文件中
r file:在指定位置插入指定文件中的所有内容
/PATTERN:从当前光标所在处向文件尾部查找
?PATTERN:从当前光标所在处向文件首部查找
n:与命令同方向
N:与命令反方向


s: 在扩展模式下完成查找替换操作******************重点

格式:s/要查找的内容/替换为的内容/修饰符
要查找的内容:可使用模式
替换为的内容:不能使用模式,但可以使用\1, \2, …等后向引用符号;还可以使用“&”引用前面查找时查找到的整个内容
修饰符:


s/要查找的内容/替换为的内容/修饰符 
i: 忽略大小写  
g: 全局替换;默认情况下,每一行只替换第一次出现  
gc:全局替换,每次替换前询问  
查找替换中的分隔符/可替换为其它字符,例如  
s@/etc@/var@g  
s#/boot#/#i  

命令模式:

 查找
/something: 在后面的文本中查找something。
?something: 在前面的文本中查找something。
/pattern/+number: 将光标停在包含pattern的行后面第number行上。
/pattern/-number: 将光标停在包含pattern的行前面第number行上。
n: 向后查找下一个。
N: 向前查找下一个。
可以用grep或vimgrep查找一个模式都在哪些地方出现过,
其中:grep是调用外部的grep程序,而:vimgrep是vim自己的查找算法。
用法为: :vim[grep]/pattern/[g] [j] files
g的含义是如果一个模式在一行中多次出现,则这一行也在结果中多次出现。
j的含义是grep结束后,结果停在第j项,默认是停在第一项。
vimgrep前面可以加数字限定搜索结果的上限,如
:1vim/pattern/ % 只查找那个模式在本文件中的第一个出现。
 
其实vimgrep在读纯文本电子书时特别有用,可以生成导航的目录。
比如电子书中每一节的标题形式为:n. xxxx。你就可以这样:
:vim/^d{1,}./ %
然后用:cw或:copen查看结果,可以用C-w H把quickfix窗口移到左侧,
就更像个目录了。

撤消更改  
u撤销最近的更改  
#u撤销之前多次更改  
U撤消光标落在这行后所有此行的更改  
按Ctrl-r重做最后的“撤消”更改  
. 重复前一个操作  
n.重复前一个操作n次  
多文件模式  
```bash
vim FILE1 FILE2 FILE3 ...  
:next 下一个  
:prev前一个  
:first 第一个  
:last 最后一个  
:wall 保存所有  
:qall退出所有  
:wqall  

定制vim的工作特性

配置文件:永久有效
全局:/etc/vimrc*********************
个人:~/.vimrc**
扩展模式:当前vim进程有效
(1) 行号
显示:set number, 简写为set nu
取消显示:set nonumber, 简写为set nonu

(2) 忽略字符的大小写
启用:set ic
不忽略:set noic
(3) 自动缩进
启用:set ai
禁用:set noai
(4) 智能缩进
启用:smartindent简写set si
禁用:set nosi
(5) 高亮搜索
启用:set hlsearch
禁用:set nohlsearch
(6) 语法高亮
启用:syntax on
禁用:syntax off
(7) 显示Tab和换行符^I 和$显示
启用:set list
禁用:set nolist
(8) 文件格式
启用windows格式:set fileformat=dos
启用unix格式:set fileformat=unix
简写:set ff=dos|unix
(9) 设置文本宽度
set textwidth=65 (vimonly)
set wrapmargin=15
(10) 设置光标所在行的标识线
启用:set cursorline,简写cul
禁用:set no cursorline
(11) 复制保留格式
启用:set paste
禁用:set nopaste



  1. [:space:] ↩︎

;