CentOS 文本处理
2018-03-19 本文已影响0人
10点睡7点起
文本处理
基本文本处理工具
- 列拼接并打印输出:
cat -n file1 file2
(将文件内容拼接输出并显示行号) - 行拼接并打印输出:
paste file1 file2
按行合并两个文件内容并打印输出-
paste -d% file1 file2
:指定分隔符的形式 “%” 为分隔符 -
paste -s file
:file文件中的所有行合并成一行输出
-
- 输出文件的前几行:
head -n num
,选项-c#
:获取指定的前#个字节 - 输出文件的后几行:
tail -n num
,选项-f
:跟踪命令,可以时时打印输出文件增加的内容 - 按列取出文件内容:
cut
(要求有明确的分隔符)- 例子:
cut -d: -f1,3-5 file
(取出file中按:分割的第1列,3-5列) - 例子:
cut -c34-43 file
(取出file文件中第34到43列的所有字符)
- 例子:
- 文件内容按行反序输出:
tac file
(从最后一行到第一行) - 文件内容按列逆向输出:
rev file
(从行尾到行首) - 文本数据统计:
wc -lLc file
- 文件内容排序:
sort -rnu file
(文件内容逆序、按数值、去重排序,不修改文件) - 重复行报告处理:
uniq -cdu file
(连续出现并且完全相同定义为重复)(重复数、显重、显不重)
通配符以及正则
通配符针对文件名的匹配操作
- 括号扩展:
{}
表示括号内的内容全部展开;[]
表示括号中的任意一个 - 文件通配符:
*
匹配零个或者多个字符;?
匹配任何单个字符;[^]
匹配指定范围外的任意单个字符 - 查看预定义的通配符
man 7 glob
正则针对文件内容的匹配操作
- 正则表达式:基本正则表达式 与 扩展正则表达式相差
\
符号 - 匹配任意单个字符:
.
(与通配符有区别) - 字符字数匹配:
-
*
:表示前面的字符任意次,.*
表示任意长度的字符串 -
\?
:表示前面的字符出现0次或者1次 -
\+
:表示前面的字符出现至少一次 -
\{m\}
:前面的字符出现m次 -
\{m,n\}
:前面的字符出现至少m次,最多n次 -
\{m,\}
:前面的字符至少出现m次
-
- 字符位置锚定:
-
^
:行首锚定 -
$
:行尾锚定 -
^PATTERNS
:行首出现正则匹配的锚定 -
\<或者\b
:词首锚定 -
\>或者\b
:词尾锚定 -
\<PATTERN>\
:单词锚定
-
- 分组:
\(keyword\)
: 表示将一个或者多个字符捆绑在一起,当做一个整体进行处理 - 后向引用:
\1
从左起第一个\
(到右侧第一个与之匹配的)\
符号之间模式匹配到的字符(字符不是模式) - 或者关系:
a\|b
a或者b
grep sed awk
grep命令:文本搜索过滤工具,根据用户指定的"模式"对目标文本进行匹配检测,将匹配的行打印输出(检索工具)
- 命令格式:
grep [选项...] 模式 [文件名...]
- 常用选项:
-
-e PATTERN1 -e PATTERN2
: 表示或者的关系 -
-w
:按单词匹配 (数字、字母、“_”不是分割符,“-”是分割符) -
-n
:显示匹配的行号码 -
-v
:显示没有匹配到的行 -
-o
:只显示匹配到的行 -
-i
:忽略匹配到的字符大小写 -
-ABC
:显示匹配到的前后几行 -
-E
: 扩展的正则表达式(= egrap)
-
sed命令:一种在线行编辑器,每次处理一行并送入标准输出中(搜索匹配处理工具)
- 命令格式:
sed [选项...] “脚本” 输入文件...
- 常用选项:
-
-r
: 支持扩展的正则表达式 -
-e 脚本1 -e 脚本2
:指定多脚本运行 -
-f 脚本
: 从指定文件中读取并运行脚本 -
-i.bak
: 直接修改源文件,但是有备份
-
- 脚本:由地址和编辑命令两部分联合构成,没有分隔符,连起来写
- 地址定界:
- 省略地址:表示对全文进行处理
-
#
:指定行号 -
$
:最后一行 -
/regexp/
:模式匹配到的行 -
#,/regexp/
:从指定行到模式匹配的行 -
#1,#1
:从指定行1到指定行2 -
/regexp1/,/regexp2/
:从模式匹配的行1到模式匹配的行2 -
#,+n
:从指定的行开始,到向下的第n行 -
1~2
:从1开始步进2
- 编辑命令:
-
d
: 删除模式空间中的行 -
p
: 打印模式空间中的行 -
=
: 为模式空间中的行打印行号 -
a [\]text
:在行后添加内容(text中有空格的情况下使用\符号)可使用\n
添加多行 -
w /path/to/somewhere
:指定的内容另存到指定文件中 -
!
:模式空间中匹配行取反操作 -
s/old/new/替换标记
查找替换命令,分隔符无所谓 (这里可以使用后向引用操作 & \1)
-g
全局替换
-i
不匹配大小写
注意: 在正则表达式中匹配的字符有通配符的作用,需要使用转义符。
-
awk命令:报表生成器,格式化文本的输出
-
命令格式:
awk [选项] 'program' file
awk [选项] 'BEGIN{action;...}pattern{action;...}END{action;...}' file
-
常用选项:
-
-F
:直接跟着分隔符号(省略的时候表示以空格为分割符号) -
-v
或者var=value
:用来设置program中使用的参数 -
-f /path/from/awk-脚本
: 从脚本中载入
-
-
program的基本格式:
pattern{action statement}
- patten部分决定动作语句何时触发事件
- action部分表示对数据的处理,放在{}内
-
pattern(正则表达式 && 判断)
- 省略不写的情况: 匹配文件的所有行
- /regexp/ : 处理匹配到的行
- /reg1/,/reg2/ :不能直接使用数字来指定行数(可以使用NR变量构建关系表达式来指定行)
- 关系表达式:
- 算数操作符 (x+y, x-y, x*y, x/y, x^y, x%y)
- 赋值操作符 (=, +=, -=, *=, /=, %=, ^=, ++, --)
- 比较操作符 (==, !=, >, >=, <, <=)
- 模式匹配符 (~ 左侧是否匹配包含右侧,!~ 左侧是否不匹配包含右侧)
- 逻辑操作符 (与&&,或||,非!)
- BEGIN(只在开始时执行一次) END(在文本结束时执行一次)
-
action
- print : “,”隔开多个输出,打印默认空格是分隔符,使用“;”自定义分隔符
print $1 ";" $2
- printf : 格式化输出命令
printf “格式1 格式2” ,变量1,变量2...
- 条件表达式(三目表达式) 条件?符合时执行:不符合时执行
- if(条件) {statement;...} [else{statement;...}]
- [do{statement;...}]while(条件) {statement;...}
- for(init;条件;变量修改){statement;...}
- print : “,”隔开多个输出,打印默认空格是分隔符,使用“;”自定义分隔符
-
内置变量
-
FS
:(输入字段分隔符)用法-v FS=";"
,功能与-F选项完全一致,但是可以在program中使用 -
OFS
:(输出字段分隔符)用法-v OFS="%"
, 默认情况下是空格 -
RS
:(输入记录分隔符,指定输入时的换行符)用法-v RS=" "
, 按照设定将输入数据划分成记录段 -
ORS
:(输出记录分隔符,指定输出时的换行符)用法-v ORS=" "
,按照设定将输出时的换行符替换 -
NF
:(字段数量) -
NR
:(记录号) -
FNR
:(在处理多文件的情况下,对每个文件的记录号分别计数) -
FILENAME
: (当前的文件名) -
ARGC
:(命令行参数个数) 包括awk自身 -
ARGV
:(命令行参数矩阵)
-
-
awk数组:
- name[$i]++ 的主要功能是将每一行的第一个字段作为索引信息,然后++完成次数的统计
- for(var in name){print var, name[var]}
-
awk函数
- srand():随机数函数种子
- rand():随机数生成
- sub(r,s,[t]) :对字符串t搜索r表示的模式匹配的内容,并将第一个匹配到的内容替换成s
- gsub(r,s,[t]):对字符串t搜索r表示的模式匹配的内容,并将所有匹配到的内容替换成s
- split(s,array,[t]):以t为分隔符切割字符串s,逐个放入到array数组中,索引值依次为1,2,3...
- length() 输出字符串的长度