Mark blog

知行合一 划水归档

Linux 文本处理工具(一)

抽取文本的工具

文件内容:less和 cat

文件截取:head和tail

按列抽取:cut

按关键字抽取:grep

文件查看

文件查看命令 :

cat ,tac ,rev

cat [OPTION]… [FILE]…

-E: 显示行结束符$ 

-n: 对显示出的每一行进行编号 

-A:显示所有控制符 

-b:非空行编号 

-s:压缩连续的空行成一行 

tac

rev

分页查看文件内容

more: 分页查看文件

more [OPTIONS…] FILE…

-d: 显示翻页及退出提示 

less:一页一页地查看文件或STDIN输出

查看时有用的命令包括:

/文本 搜索 文本 

n/N 跳到下一个 或 上一个匹配 

less 命令是man命令使用的分页器

显示文本前或后行内容

head [OPTION]… [FILE]…

-c #: 指定获取前#字节 

-n #: 指定获取前#行 

-#: 指定行数 

tail [OPTION]… [FILE]…

-c #: 指定获取后#字节 

​ -n #: 指定获取后#行

-f: 跟踪显示文件fd新追加的内容,常用日志监控 

相当于 --follow=descriptor 

-F: 跟踪文件名,相当于—follow=name --retry     

tailf 类似tail –f,当文件不增长时并不访问文件

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

cut [OPTION]… [FILE]…

-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

整理文本:sort

比较文件:diff和patch

收集文本统计数据wc

计数单词总数、行总数、字节总数和字符总数

可以对文件或STDIN中的数据运行

wc story.txt 

39     237 1901     story.txt 

行数 字数 字节数  文件名

常用选项

​ -l 只计数行数

​ -w 只计数单词总数

​ -c 只计数字节总数

​ -m 只计数字符总数

​ -L 显示文件中最长行的长度

文本排序sort

把整理过的文本显示在STDOUT,不改变原始文件

sort [options] file(s) 

常用选项

​ -r 执行反方向(由上至下)整理

​ -R 随机排序

​ -n 执行按数字大小整理

​ -f 选项忽略(fold)字符串中的字符大小写

​ -u 选项(独特,unique)删除输出中的重复行

​ -t c 选项使用c做为字段界定符

​ -k X 选项按照使用c字符分隔的X列来整理能够使用多次

uniq

uniq命令:从输入中删除前后相接的重复的行

uniq [OPTION]… [FILE]…

​ -c: 显示每行重复出现的次数

​ -d: 仅显示重复过的行

​ -u: 仅显示不曾重复的行

​ 注:连续且完全相同方为重复

常和sort 命令一起配合使用:

sort userlist.txt | uniq -c 

比较文件

比较两个文件之间的区别

diff foo.conf foo2.conf 

5c5 

< use_widgets = no 

--- 

> use_widgets = yes 

注明第5行有区别(改变)

复制对文件改变patch

diff 命令的输出被保存在一种叫做”补丁”的文件中

使用 -u 选项来输出"统一的(unified)"diff格式文件,最适用于补丁文件 

patch 复制在其它文件中进行的改变(要谨慎使用)

适用 -b 选项来自动备份改变了的文件 

$ diff -u foo.conf foo2.conf > foo.patch 

$ patch -b foo.conf foo.patch 

Linux文本处理三剑客

grep:文本过滤(模式:pattern)工具

grep, egrep, fgrep(不支持正则表达式搜索) 

sed:stream editor,文本编辑工具

awk:Linux上的实现gawk,文本报告生成器

grep

grep: Global search REgular expression 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命令选项

--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,不支持正则表达式 

   可以测试文件1和文件2的包含关系

正则表达式

REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能

程序支持:grep,sed,awk,vim, less,nginx,varnish等

分两类:

基本正则表达式:BRE

扩展正则表达式:ERE

grep -E, egrep 

正则表达式引擎:

采用不同算法,检查处理正则表达式的软件模块

PCRE(Perl Compatible Regular Expressions)

元字符分类:字符匹配、匹配次数、位置锚定、分组

man 7 regex

基本正则表达式元字符

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

正则表达式

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

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

^ 行首锚定,用于模式的最左侧

$ 行尾锚定,用于模式的最右侧

^PATTERN$ 用于模式匹配整行

^$ 空行

^[[:space:]]*$ 空白行

< 或 \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:] 可打印的非空白字符
[:punct:] 标点符号
[:xdigit:] 十六进制数字

egrep及扩展的正则表达式

egrep = grep -E

egrep [OPTIONS] PATTERN [FILE…]

扩展正则表达式的元字符:

字符匹配:

. 任意单个字符 

[] 指定范围的字符 

[^] 不在指定范围的字符     

扩展正则表达式

次数匹配:

 *:匹配前面字符任意次 

?: 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    

sed工具

用法:

sed [option]... 'script' inputfile... 

常用选项:

-n:不输出模式空间内容到屏幕,即不自动打印 

-e: 多点编辑 

-f:/PATH/SCRIPT_FILE: 从指定文件中读取编辑脚本 

-r: 支持使用扩展正则表达式 

-i.bak: 备份文件并原处编辑     

script:

'地址命令' 

地址定界:
(1) 不给地址:对全文进行处理
(2) 单地址:
​ #: 指定的行,$:最后一行
​ /pattern/:被此处模式所能够匹配到的每一行
(3) 地址范围:
​ #,#
​ #,+#
​ /pat1/,/pat2/
​ #,/pat1/
(4) :步进
​ 1
2 奇数行
​ 2~2 偶数行

编辑命令:

d             删除模式空间匹配的行,并立即启用下一轮循环 

p             打印当前模式空间内容,追加到默认输出之后 

a [\\]text         在指定行后面追加文本,支持使用\n实现多行追加 

i [\\\]text         在行前面插入文本 

c [\]text         替换行为单行或多行文本 

w /path/file     保存模式匹配的行至指定文件 

r /path/file     读取指定文件的文本至模式空间中匹配到的行后 

=             为模式空间中的行打印行号 

!             模式空间中匹配行取反处理     

s/// 查找替换,支持使用其它分隔符,s@@@,s###

替换标记:

g         行内全局替换 

p         显示替换成功的行 

w         /PATH/FILE 将替换成功的行保存至文件中     

高级编辑命令

P: 打印模式空间开端至\n内容,并追加到默认输出之前 

h: 把模式空间中的内容覆盖至保持空间中 

H:把模式空间中的内容追加至保持空间中 

g: 从保持空间取出数据覆盖至模式空间 

G:从保持空间取出内容追加至模式空间 

x: 把模式空间中的内容与保持空间中的内容进行互换 

n: 读取匹配到的行的下一行覆盖至模式空间 

N:读取匹配到的行的下一行追加至模式空间 

d: 删除模式空间中的行 

D:如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本, 并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间 不包含换行符,则会像发出d命令那样启动正常的新循环