原始文本文件(test.txt):
[xcosy@codedancing ~]$ cat ./test.txt
序号 姓名 毕业院校 学院 专业
1 Bob 华中科技大学 软件学院 软件工程
2 Alice 清华大学 机械工程学院 机械工程
3 John 北京大学 人文学院 哲学
4 Nike 中国科学技术大学 计算机学院 计算机科学与技术
5 Alon 哈尔滨工业大学 理学院 理论物理学,应用数学
awk
AWK是一种处理文本文件的语言,也是Linux中一个强大的文本分析工具。通常用来对文本文件按照指定的分隔符把行、列进行分割形成记录和字段,方便处理。
AWK 工作流程可分为三个部分:
- 读输入文件之前执行的代码段(由BEGIN关键字标识)。
- 主循环执行输入文件的代码段。
- 读输入文件之后的代码段(由END关键字标识)。
[xcosy@codedancing ~]$ awk 'BEGIN{print "awk begin..."} {print $1,$2,$3} END{print "awk end."}' ./test.txt
awk begin...
序号 姓名 毕业院校
1 Bob 华中科技大学
2 Alice 清华大学
3 John 北京大学
4 Nike 中国科学技术大学
5 Alon 哈尔滨工业大学
awk end.
awk '{[pattern] action}' {filenames}
行匹配语句,只能用单引号
# 每行按空格或TAB分割,输出文本中的1、4项
[xcosy@codedancing ~]$ awk '{print $1,$4}' ./test.txt
序号 学院
1 软件学院
2 机械工程学院
3 人文学院
4 计算机学院
5 理学院
# 每行按空格或TAB分割,输出文本中的1、4项(格式化输出)
[xcosy@codedancing ~]$ awk '{printf "%s\t%s\n", $1,$4}' ./test.txt
序号 学院
1 软件学院
2 机械工程学院
3 人文学院
4 计算机学院
5 理学院
awk -F
-F 相当于内置变量FS, 指定分割字符
# 以 空格 和 , 分割,输出指定的列
[xcosy@codedancing ~]$ awk -F '[ ,]' '{print $1,$2,$5,$6}' ./test.txt
序号 姓名 专业
1 Bob 软件工程
2 Alice 机械工程
3 John 哲学
4 Nike 计算机科学与技术
5 Alon 理论物理学 应用数学
awk -v
设置变量,区分大小写
# 定义变量i=1,输出第一列,和运算后的第一列
[xcosy@codedancing ~]$ awk -vi=1 '{print $1, $1+i}' ./test.txt
序号 1
1 2
2 3
3 4
4 5
5 6
过滤
# 过滤第一列大于2的行
[xcosy@codedancing ~]$ awk '$1>2 {print $1,$2,$3}' ./test.txt
序号 姓名 毕业院校
3 John 北京大学
4 Nike 中国科学技术大学
5 Alon 哈尔滨工业大学
# 过滤第一列大于2并且第二列等于Alon的行
[xcosy@codedancing ~]$ awk '$1>2 && $2=="Alon" {print $1,$2,$3}' ./test.txt
5 Alon 哈尔滨工业大学
正则匹配
# 匹配第二列包含A的行
[xcosy@codedancing ~]$ awk '$2 ~/A/ {print $1,$2,$3}' ./test.txt
2 Alice 清华大学
5 Alon 哈尔滨工业大学
# 匹配包含o的行
[xcosy@codedancing ~]$ awk '/o/ {print $1,$2}' ./test.txt
1 Bob
3 John
5 Alon
# 匹配不包含o的行
[xcosy@codedancing ~]$ awk '!/o/ {print $1,$2}' ./test.txt
序号 姓名
2 Alice
4 Nike
关于awk中的变量
awk中的变量分为内置变量和自定义变量:
内置变量就是awk预定义好的、内置在awk内部的变量,而自定义变量就是用户定义的变量。
FS(Field Separator):输入字段分隔符, 默认为空白字符
OFS(Out of Field Separator):输出字段分隔符, 默认为空白字符
RS(Record Separator):输入记录分隔符(输入换行符), 指定输入时的换行符
ORS(Output Record Separate):输出记录分隔符(输出换行符),输出时用指定符号代替换行符
NF(Number for Field):当前行的字段的个数(即当前行被分割成了几列)
NR(Number of Record):行号,当前处理的文本行的行号。
FNR:各文件分别计数的行号
ARGC:命令行参数的个数
ARGV:数组,保存的是命令行所给定的各参数
sed
Linux sed 命令是利用脚本来处理文本文件, 可依照脚本的指令来处理、编辑文本文件,对于大文件操作不错,如果你一个 100 万行的文件,要在第 100 行加某些文字,此时使用 vim 可能会很不方便,此时可通过 sed 直接修改。
打印
,p,将某个选择的数据印出。通常会与参数 -n 一起运行,不然会重复输出
新增
,a,后面可以接字串,而这些字串会在新的一行出现(指定行的下一行)
插入
, i,后面可以接字串,而这些字串会在新的一行出现(指定行的上一行)
替换
,c,后面可以接字串,这些字串可以取代指定行
取代
,s,通常该动作可以搭配正规表示法!例如 1,20s/old/new/g
删除
,d,删除指定行输出
# 打印,配合-n参数,最后一行的行标可以用$代替
[xcosy@codedancing ~]$ sed -n '1,$ p' ./test.txt
序号 姓名 毕业院校 学院 专业
1 Bob 华中科技大学 软件学院 软件工程
2 Alice 清华大学 机械工程学院 机械工程
3 John 北京大学 人文学院 哲学
4 Nike 中国科学技术大学 计算机学院 计算机科学与技术
5 Alon 哈尔滨工业大学 理学院 理论物理学,应用数学
# 输出包含 o 的行
[xcosy@codedancing ~]$ sed -n '/o/ p' ./test.txt
1 Bob 华中科技大学 软件学院 软件工程
3 John 北京大学 人文学院 哲学
5 Alon 哈尔滨工业大学 理学院 理论物理学,应用数学
# 新增行 a,在第二行下面新增
[xcosy@codedancing ~]$ sed '2 a \这里是新增行' ./test.txt
序号 姓名 毕业院校 学院 专业
1 Bob 华中科技大学 软件学院 软件工程
这里是新增行
2 Alice 清华大学 机械工程学院 机械工程
3 John 北京大学 人文学院 哲学
4 Nike 中国科学技术大学 计算机学院 计算机科学与技术
5 Alon 哈尔滨工业大学 理学院 理论物理学,应用数学
# 插入行 i,在第二行上面插入
[xcosy@codedancing ~]$ sed '2 i \这里是新增行' ./test.txt
序号 姓名 毕业院校 学院 专业
这里是新增行
1 Bob 华中科技大学 软件学院 软件工程
2 Alice 清华大学 机械工程学院 机械工程
3 John 北京大学 人文学院 哲学
4 Nike 中国科学技术大学 计算机学院 计算机科学与技术
5 Alon 哈尔滨工业大学 理学院 理论物理学,应用数学
# 删除 d,删除第2 - 5行
[xcosy@codedancing ~]$ sed '2,5 d' ./test.txt
序号 姓名 毕业院校 学院 专业
5 Alon 哈尔滨工业大学 理学院 理论物理学,应用数学
# 替换指定行
[xcosy@codedancing ~]$ sed '2,$ c \没有数据' ./test.txt
序号 姓名 毕业院校 学院 专业
没有数据
# 将 学院 修改为 【学院】,支持正则
[xcosy@codedancing ~]$ sed 's/学院/【学院】/g' ./test.txt
序号 姓名 毕业院校 【学院】 专业
1 Bob 华中科技大学 软件【学院】 软件工程
2 Alice 清华大学 机械工程【学院】 机械工程
3 John 北京大学 人文【学院】 哲学
4 Nike 中国科学技术大学 计算机【学院】 计算机科学与技术
5 Alon 哈尔滨工业大学 理【学院】 理论物理学,应用数学
多条语句操作
# 删除 2 - 5 行,再把Alon替换为Tim
[xcosy@codedancing ~]$ sed -e '2,5 d' -e 's/Alon/Tim/g' ./test.txt
序号 姓名 毕业院校 学院 专业
5 Tim 哈尔滨工业大学 理学院 理论物理学,应用数学
直接修改文件【谨慎操作】
# 使用 -i 参数,支持正则表达
# 在最后一行后添加内容
[xcosy@codedancing ~]$ sed -i '$ a \======结束======' ./test.txt
[xcosy@codedancing ~]$ cat ./test.txt
序号 姓名 毕业院校 学院 专业
1 Bob 华中科技大学 软件学院 软件工程
2 Alice 清华大学 机械工程学院 机械工程
3 John 北京大学 人文学院 哲学
4 Nike 中国科学技术大学 计算机学院 计算机科学与技术
5 Alon 哈尔滨工业大学 理学院 理论物理学,应用数学
======结束======
# 把文件中的 . 替换为 !
sed -i 's/\./\!/g' ./example.txt
grep
grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
常见格式:
# 单个文件查找
grep match_pattern file_name
grep "match_pattern" file_name
# 多文件查找
grep "match_pattern" file_1 file_2 file_3 ...
# 查询匹配的数量
grep -c "match_pattern" file_name
# 输出匹配内容及其行号
grep -n "match_pattern" file_name
# 同时匹配多个内容
grep -e "match_pattern1" -e "match_pattern2" file_name
总结
grep 更适合单纯的查找或匹配文本
sed 更适合编辑匹配到的文本
awk 更适合格式化文本,对文本进行较复杂格式处理