shell 文本处理三剑客包含
- grep 更适合单纯的查找或匹配文本
- sed 更适合编辑匹配到的文本
- awk 更适合格式化文本,对文本进行较复杂格式处理
三剑客之一 ----- awk
awk 是一种强有力的文本分割工具,在使用 awk 是一定要注意其中的引号必须是单引号,否则起不到分割的作用
其语法需求
awk [选项参数] 'script' var=value file(s)
awk 中的变量
用法一:分割一段带空格的字符串
echo "a b c" |awk '{print $3}'
# 其输出为 c
awk 默认使用空格分割字符串,想通过其他字符分割字符串,需要使用参数 -F
比如
echo "a,b,c" |awk -F , '{print $3}'
# 其输出为 c
# $0 代表原本的字符串
# $1 分割后的第一个字符串
# $2 分割后的第二个字符串
# $NF 分割后的最后一个字符串
# 如果想要取第 n 个到第 m 个(如果是最后一个,可以使用 NF 替换掉 m,可以使用
echo "a b c" |awk '{for (i=n;i<=m;i++)printf("%s ", $i);print ""}'
# 如果想要取第 n 个到最后一个,可以使用
echo "a b c" |awk '{for (i=n;i<=NF;i++)printf("%s ", $i);print ""}'
用法二:分割文件中的字符串
cat test.log
1 2 3
4 5 6
取文件中的第一列和第三列
cat test.log |awk '{print $1,$3}'
# 或者
awk '{print $1,$3}' test.log
# 这两种都可以获取到文件 test.log 中的第一列和第三列信息
# 其输出信息为
1 3
4 6
用法三:设置变量
awk -v # 设置变量
# 例如 1 ,将第一列的数字加1输出
awk -v a=1 '{print $1+a,$1}' test.log
# 其输出为
2 1
5 4
# 例如 2,在输出的信息中添加额外的信息
awk -v a="abc" '{print $1,a,$1}' test.log
# 其输出为
1 abc 1
4 abc 4
# 例如 3 ,实现输出的字符串连接
awk -v a="abc" '{print $1a,$1}' test.log
1abc 1
4abc 4
用法四:执行 awk 脚本
awk -f {awk脚本} {文件名} # awk脚本的后缀名为 awk,如 test.awk,其使用为 awk -f test.awk test.log 脚本的写法需要博主深入研究下,大家有了解详细的,也可以共同分享
用法五:输出符合条件的列
awk '条件 {print $2}' 文件名
其运算符见
# 只有条件;输出文件中 第一列 大于等于 2 的所有行的内容
awk '$1>=2' test.log
# 输出
4 5 6
# 添加条件和输出列数的限制;输出文件中第一列大于等于 2 的所有内容中的第一列和第2列
awk '$1>=2 {print $1,$2}' test.log
# 输出
4 5
# 输出文件中第一列大于等于 0 且第二列等于 5 的所有内容中的第一列和第2列
awk '$1>=0 && $2==5 {print $1,$2}' test.log
# 输出为
4 5
-----------------------------------------------------------------------------------------------------------------------------------
下面的示例使用的文件 test.log 内容为
cat test.log
2 this is a test
3 Are you like awk
This's a test
10 There are orange,apple,mongo
用法六:使用正则
# ~ 表示模式开始。// 中是模式。
# 示例一:输出第二列包含 "th",并打印第二列与第四列
awk '$2 ~ /th/ {print $2,$4}' test.log
# 输出为
this a
# 示例二:输出包含"re" 的行
awk '/re/ ' test.log
# 输出为
3 Are you like awk
10 There are orange,apple,mongo
# 示例三:输出忽略大小写包含 this 的所有内容
awk 'BEGIN{IGNORECASE=1} /this/' test.log
# 输出为
2 this is a test
This's a test
# 示例四:输出不包含 th 的所有行的第2列和第4列
awk '$2 !~ /th/ {print $2,$4}' test.log
或者
awk '!/th/ {print $2,$4}' test.log
# 输出为
Are like
a
There orange,apple,mongo
awk 脚本
关于awk脚本,我们需要注意两个关键词BEGIN和END。
- BEGIN{ 这里面放的是执行前的语句 }
- END {这里面放的是处理完所有的行后要执行的语句 }
- {这里面放的是处理每一行时要执行的语句}
三剑客之二 --- sed
sed是stream editor的简称,擅长对文件进行各种正则操作、插入操作、替换操作和删除操作,可以全局,可以指定特定范围的行或者特定特征的行。
s/pat/replace/: 正则替换
前插行i, 后插行a, 替换行c, 删除行d, 输出行p
N: 读入下一行,同时存储;n:读入下一行,抛弃当前行
用法一:替换特定的文本
cat test.log
ID 2 cell 4 cell 8 cell embryo
Pou5f1_1 2 3 4 5
Nanog_1 2 3.2 4.3 5
c-Myc 2 3 4 5
Tet1_3 2 3 4 5
# 将第一个空格替换为 _
sed 's/ /_/' test.log