linux 文本处理三剑客

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

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值