Linux运维三剑客

原始文本文件(test.txt):

[xcosy@codedancing ~]$ cat ./test.txt

序号 姓名 毕业院校 学院 专业
1 Bob 华中科技大学 软件学院 软件工程
2 Alice 清华大学 机械工程学院 机械工程
3 John 北京大学 人文学院 哲学
4 Nike 中国科学技术大学 计算机学院 计算机科学与技术
5 Alon 哈尔滨工业大学 理学院 理论物理学,应用数学
awk

AWK是一种处理文本文件的语言,也是Linux中一个强大的文本分析工具。通常用来对文本文件按照指定的分隔符把行、列进行分割形成记录和字段,方便处理。

AWK 工作流程可分为三个部分:

  1. 读输入文件之前执行的代码段(由BEGIN关键字标识)。
  2. 主循环执行输入文件的代码段。
  3. 读输入文件之后的代码段(由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 更适合格式化文本,对文本进行较复杂格式处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值