linux 文本处理工具
第一节:Linux 文本处理工具
1.1 抽取文本的工具
(1)文件查看命令
cat [option] [file_name]
cat -E 显示行结束符$ -n 对显示出的每一行进行编号 -A 显示所有控制符 -b 非空行编号 -s 压缩连续的空行成一行
tac [file_name]
竖行反向显示文件内容:第一行变最后一行,最后一行变第一行
rev [file_name]
横行反向显示文件内容:第一个字母变成最后一个字母,最后一个字母变成第一个字母
more [file_name]
分页显示文件内容,到底退出
less [file_name]
分页显示文件内容,可以上下翻页、搜素,到底不退出
(2)文件截取
head [option] [file_name] -n N #指定获取前N行 -c N #指定获取前N字节 tail [option] [file_name] -n N #指定获取后N行 -c N #指定获取后N字节 -f #跟踪显示文件 fd 新追加的内容,常用日志监控 -F #跟踪文件名,可以看文件是否被删除 tailf 类似于 tail -f,当文件不增长时并不访问文件(动态追踪) 例:ifconfig | head -n 2 | tail -n 1 #取一个文件的第二行(先取前两行,再去最后一行)
(3)按列抽取
cut -d -f -d #指明分隔符 -f #指明被分隔的区域范围(离散、连续) -c #按字符切割 --output-delimiter=STRING #指定输出分隔符 例,cut -d @ -f 1-3,7 #按@分隔,取 1-3 列和第七列
(3)合并文件
paste [option] [file1] [file2] 合并两个文件同行号的列到一行 -d 分隔符 #指定分隔符,默认 Tab -s #所有行合成一行显示(一个文件一行)
1.2 分析文本的工具
(1)文本数据统计:wc(支持标准输入):默认显示行 单词 字节
wc -l #统计行数 wc -c #统计字节 wc -w #统计单词(认为空格分开就是单词)
(2)文本排序工具:sort
sort -r 反方向整理 sort -R 随机排序 sort -n 执行按数字大小整理 sort -f 忽略大小写 sort -u 去重 sort -t 分隔符 -k 列 -n -r #-t指明分隔符,-k指定列,按数字排序 取反
(3)去重:uniq
uniq -c:显示每行出现的次数 uniq -d:仅显示重复过的行 uniq -u:仅显示不曾重复的行 注:连续且完全相同方为重复 所以一般先排序后去重,常和 sort 命令一起配合使用:sort user.txt | uniq -c
(4)比较文件
比较文件:diff 和 patch diff f1 f2 #比较两个文件的不同 diff -u #显示时间等信息 diff -u f1 f2 > 12.bak #重定向到新文件 patch -b f2 12.bak #f1 丢了,可以找回找回以 f2 显示 f2 丢了,加上-b 选项备份
1.3 文本三剑客之 grep
grep:文本过滤(基于行过滤) grep、egrep、fgrep(不支持正则表达式搜索) 例:grep root /etc/passwd = grep $USER /etc/passwd = grep `whoami` /etc/passwd #支持变量、命令 --color=auto 对匹配到的文本着色显示 -v 显示不被匹配的行(取反) -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)正则表达式:
通配符里匹配文件名,正则表达式匹配的是文件里的内容
基本正则表达式:BRE
扩展正则表达式:ERE(egrep)
(2)正则表达式引擎:
采用不同算法,检查处理正则表达式的软件模块 PCRE
(3)元字符分类:字符匹配、匹配次数、位置锚定、分组
字符匹配:
. 匹配任意单个字符 [] 匹配指定范围内的任意单个字符 [^] 匹配指定范围外的任意单个字符 [:alnum:] 字母和数字 [:alpha] 字母(包含大小写) [:lower:] 小写字母 [:blank:] 空白字符 [:space:] 水平和垂直的空白字符 [:cntrl:] 不可打印的控制字符 [:digit:] 十进制数字 [:graph:] 可打印的非空白字符 [:print:] 可打印字符 [:punct:] 标点符号
匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数
* 匹配前面的字符任意次,包括 0 次 贪婪模式:尽可能长的匹配 .* 任意长度的任意字符 \? 匹配其前面的字符 0 或 1 次 \+ 匹配其前面的字符至少 1 次 \{n\} 匹配前面的字符 n 次 \{m,n\} 匹配前面的字符至少 m 次,至多 n 次 \{,n\} 匹配前面的字符至多 n 次 \{n,\} 匹配前面的字符至少 n 次 例,取分区利用率:#df | grep "/dev/sd" | grep -o "[0-9]\{1,3\}%" | grep -o "[0-9]*" #df | grep "/dev/sd" | tr -s ' ' '%' | cut -d '%' -f 5
位置锚定:
^ 行首锚定,用于模式的最左侧 $ 行尾锚定,用于模式的最右侧 ^PATTERN$ 用于匹配整行 ^$ 空行 ^[[:space:]]*$ 空白行 \<或\b 词首锚定,用于单词模式的左侧 #字母数字下划线为单词 \>或\b 词尾锚定,用于单词模式的右侧
分组:
分组:\(\)将一个或多个字符捆绑在一起,当做一个整体进行处理,如:\(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
(4)扩展的正则表达式:
次数匹配:
*:匹配前面字符任意次 ?:0 次或 1 次 +:1 次或多次 {m}:匹配 m 次 {m,n}:至少 m 次,至多 n 次
位置锚定: ^ 行首 $ 行尾 \<,\b 词首 \>,\b 词尾
分组:() 后项引用:\1,\2,… 或者: a|b:a 或 b C|cat:C 或 cat (C|c)at:Cat 或 cat
1.4 vi、vim 文本编辑器
vim +[行号] [file] #打开文件,光标直接处于第几行行首 vim +/PATTERN #打开文件,光标直接处于所匹配行的行首 vim -b file #以二进制方式打开文件 vim -d file1 file2… #比较多个文件 vim -m file #只读打开文件 ex file 或 vim -e #直接进入 ex 模式
(1)三种模式:
命令(Normal)模式:默认模式,移动光标,剪切/粘贴文本
插入(Insert)或编辑模式:修改文本
扩展命令(extended command)模式:保存,退出等
(2)模式切换:
Esc键:退出当前模式
Esc键 Esc键:总是返回到命令模式
默认模式→编辑模式:按键
i(当前光标处插入)
I(当前行首插入)
a(当前光标下一字符处插入)
A(当前行尾插入)
o(开启一个新行在当前光标下一行)
O(开启一个新行在当前光标上一行)
编辑模式→默认模式
按键[Esc]
默认模式→扩展命令(ex)模式
按键冒号":"
ex 模式:
:wq(保存退出)
:q(退出)
:!(强制)
:w [文件名](另存)
:r [文件名](把另一文件读入当前文件)
命令模式:两个 ZZ 也能保存退出(不推荐)
扩展命令(ex)模式:
:!command #不退出执行命令 :r!command #将命令的输出写入文件
echo -e "\e[1;31mred\e[0m" #显示有颜色字符 red 在插入模式下:
[Ctrl]+v+[ [1;31m red [Ctrl]+v+[ [0m #将颜色写进文件去
(3)命令模式下跳转
字符间跳转:h:左 l:右 j:下 k:上
单词间跳转:
w:下一个单词词首 e:当前或下一单词的词尾 b:当前或下一单词的词首
#COMMAND:由#指定一次跳转的数
当前页跳转:H:页首 M:页中间行 L:页底
行首行尾跳转:^:跳转至行首的第一个非空白字符 0:跳转至行首 $:跳转至行尾
行间移动:#G、扩展模式:# :跳转至由#指定行 G:最后一行 1G,gg 第一行
句间移动: ):下一句 (:上一句
段落间移动: }:下一段 {:上一段
(4)字符编辑
x:删除光标处的字符 #x:删除光标处起始的#个字符 xp:交换光标所在处的字符及后面字符的位置 ~:转换大小写 J:删除当前行后的换行符
(5)替换命令
r:替换光标所在处的字符
R:切换成 REPLACE 模式
(6)删除命令
d:删除命令,可结合光标跳转字符,实现范围删除 d$:删除到行尾 d^:删除到非空行首 d0:删除到行首 dw:光标位于词首,删这个单词 dd:删除光标所在的行 #dd:多行删除
D:从当前光标位置一直删除到行尾,留空行,等同于 d$
(7)复制命令
y:复制,行为相当于 d 命令 y$、y0、y^、ye、yw yy:复制行 #yy:复制多行 Y:复制整行
(8)粘贴命令
p 粘贴于当前行的下一行;
P 粘贴于当前行的上一行。
(9)改变命令:和 d 命令差不多,只不过自动切换到插入模式
c:修改后切换成插入模式,命令模式→插入模式 c$、c^、c0、cw cc:删除当前行并输入新内容,相当于 S #cc: C:删除当前光标到行尾,并切换成插入模式
(10)扩展命令模式:
地址定界: :start_pos,end_pos :# 具体第#行,例如 2 表示第 2 行 :#,# 从左侧#表示起始行,到右侧#表示结尾行 后加操作数(d y…) . 当前行 $ 最后一行 .,$-1 当前行到倒数第二行 % 全文,相当于 1,$
/pat1/,/pat2/ 从第一次被 pat1 模式匹配到的行开始,一直到第一次被 pat2匹配到的行结束。
例:/^b/,/^f/d 回车 #删除 b 开头的行到 f 开头的行
#,/pat/ /pat/,$
使用方式:后跟一个编辑命令: d y w file(将范围外的行另存至指定文件中) r file(在指定位置插入指定文件中的所有内容)
查找: /PATTERN:从当前光标所在处向尾部查找 ?PATTERN:从当前光标所在处向文件首部查找 n(与命令同方向) N(与命令反方向)
s:在扩展模式下完成查找替换操作 格式:1,10s/要查找的内容/替换为的内容/修饰符 第一行到第 10 行 要查找的内容:可使用模式 替换为的内容:不能使用模式,但可以使用\1,\2,…等后向引用符号;还可以使用“&”引用前面查找时查找到的整个内容。
例:%s/\(ni\)/\1hao/g 把 ni 全局替换为 nihao
修饰符: i:忽略大小写 g:全局替换;默认情况下,每一行只替换第一次出现 gc:全局替换,每次替换前询问
查找替换中的分隔符/可替换为其他字符,例如: s@/etc@/var/@g s#/boot#/#i
命令模式:撤销更改 u:撤销最近的更改 #u:撤销之前多次更改 U:撤销光标落在这行后所有此行的更改 [Ctrl] – r 重做最后的“撤销”更改 #与 u 作用相反 . 重复前一个操作 n. 重复前一个操作 n 次
(11)vim 寄存器:
vim 的寄存器: 有 26 个命名寄存器和一个无名寄存器,常存放在不同的剪贴板内容,可以不同会话间共享 寄存器名称:a,b,…,z 格式:”寄存器 放在数字和命令之间 如:3”ayy 表示复制 3 行内容到 a 寄存器中 "ap 表示将 a 寄存器内容粘贴 未指定,将使用无命名寄存器 有 10 个数字寄存器,用 0,1,…9 表示,0 存放最近复制内容,1 存放最近删除内容,当新的文本变更和删除时,1 转存到 2,2 转存到 3,以此类推。数字寄存器不能在不同回话间共享 hexdump -C [文件名] #查看二进制文件 编辑二进制文件: vim -b [file] #以二进制打开文件 :%!xxd #扩展模式下,利用 xxd 转换为可读的十六进制即能看懂的 插入模式下编辑二进制文件: :%!xxd -r #扩展模式下,利用 xxd 命令转换回二进制 保存退出 可视化模式:允许选择的文本块 v 面向字符 V 面向行 [Ctrl]-v 面向块 可视化键可用于与移动键结合使用: w ) } 箭头等 突出显示的文字可被删除,复制,变更,过滤,搜索,替换等 多文件模式: vim FILE1 FILE2 FILE3… :next 下一个 :prev 前一个 :first 第一个 :last 最后一个 :wall 保存所有 :qall 退出所有 :wqall 全部保存退出 使用多个窗口,多文件分隔: vim -o -O FILE1 FILE2… -o:水平分割 -O:垂直分割 在窗口间切换:[Ctrl]+ww 单文件窗口分割: Ctrl+w,s: split, 水平分割 Ctrl+w,v: vertical, 垂直分割 ctrl+w,q: 取消相邻窗口 ctrl+w,o: 取消全部窗口 : wqall 退出
(12)定制 vim 工作特性
定制 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)智能缩进 启用:msartindent,简写 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(vim only) 禁用:set wrapmargin=15 (10)设置光标所在行的标识线 启用:set cursorline,简写 cul 禁用:set no cursorline (11)复制保留格式 启用:set paste 禁用:set nopaste
了解更多: set 帮助: :help option-list :set or :set all
vi/vim 内置帮助: :help :help topic Use :q to exit help
vimtutor #vim 帮助文档