linux awk常用操作大全(快速查阅)
2023-12-25 16:39:51
?如果说sed可以完成行级别文本处理,则awk可以处理文本的每列。
收藏以便快速查阅。持续扩充中...
目录
1,从命令输出查看指定列
如过滤查看docker镜像指定列:仅查看镜像id。
先查看所有镜像,如下:
docker images
REPOSITORY ? ? TAG ? ? ? IMAGE ID ? ? ? CREATED ? ? ? ? SIZE
kindest/node ? v1.27.3 ? 89e7dc9f9131 ? 2 months ago ? ?932MB
hello-world ? ?latest ? ?feb5d9fea6a5 ? 23 months ago ? 13.3kB
如果只想获得镜像id,则:
docker images| awk '{print $3}'
效果:
IMAGE
89e7dc9f9131
feb5d9fea6a5
2,查看文件指定列
来构造一个多个列的文件:
docker images| ?awk '{print $2,$3}' > aaa
如上,将镜像列表的第2、3列内容写到了文件aaa中,查看一下:
#cat aaa
TAG IMAGE
v1.27.3 89e7dc9f9131
latest feb5d9fea6a5
查看aaa文件的第2列:
awk '{print $2}' aaa
效果:
IMAGE
89e7dc9f9131
feb5d9fea6a5
3,原地修饰所查看的列
如查看docker镜像列表时,给每个镜像id前后都拼接一个下划线:
docker images| ?awk '$3 = "_"$3"_"'
效果:
REPOSITORY ? ?TAG ? _IMAGE_ ? ID ? ?CREATED ? SIZE
kindest/node v1.27.3 ? _89e7dc9f9131_ ? 2 months ago 932MB
hello-world latest ? ?_feb5d9fea6a5_ ? ?23 months ago 13.3kB
可以看到原地修改$3,拼接_是实现了,可是怎样才能只显示镜像ID这一列?
docker images| ?awk '{$3 = "_"$3"_";print $3}'
效果:
_IMAGE_
_89e7dc9f9131_
_feb5d9fea6a5_
即 使用print实现。
4,输出文件指定行(按行数)
假设有文件aaa:
TAG IMAGE
v1.27.3 89e7dc9f9131
latest feb5d9fea6a5
输出第3行
awk 'NR==3' aaa
也可以用sed实现:
sed -n 3p aaa
?5,内容包含或匹配查找
查看文件中包含指定字符的行
如下,查看文件中包含hello的行:
awk '/hello/' a
或使用sed实现:
sed -n '/hello/p' a
查看文件中包含指定字符的行数
awk '/hello/' a| wc -l
也可以grep实现:
grep -c "hello" a
6、输出符合条件的列 对应的行
常见运算符:>? ?<??>=? ?<= ? ==? ?!=? ?%求余
有文件bbb内容如下:
#cat bbb
a ? b
1 ? 1
4 ? 4
5 ? 6
8 ? 7
输出文件中第二列大于3的行
awk '{if($2>3)print}' bbb
效果:
a ? b
4 ? 4
5 ? 6
输出文件中第二列的值能整除2的行
awk '{if($2%2==0)print}' bbb
效果:
a ? b
4 ? 4
5 ? 6
输出文件中第一列和第二列相同的行
awk '{if($1==$2)print}' bbb
效果:
1 ? 1
4 ? 4
输出文件中第一列和第二列不相同、且第一列值大于7的行
awk '{if($1!=$2 && $1>7)print}' bbb
效果:
a ? b
8 ? 7
输出文件中第一列值大于等于5的行数
awk '{if($1>=5)print}' bbb| wc -l
效果:
3
7,列替换
替换主要用到gsub函数。格式:gsub(/原内容/, 修改后内容, [ 指定列,不指定则默认所有列 ] )
假设有文件aaa;
TAG IMAGE
v1.27.3 89e7dc9f9131
latest feb5d9fea6a5
将第一列中的v字符替换为new
接下来我们将第一列中的v字符替换为new:
awk '{gsub(/v/,"new",$1);print $1}' aaa
效果:
TAG
new1.27.3
latest
如果想都看到每列,则将print后的$1去掉即可。
将第一列整体替换为new
awk '{gsub($1,"new",$1);print}' bbb
效果:
new b
new 1
new 4
new 6
new 7
8,awk结果写入文件
docker images| ?awk '{$3 = "_"$3"_";print $3}' > aaa
和大多数指令用法一样,使用>完成写入。如果是>> aaa,就是追加而不覆盖。
9,按需修改文件名(批量)
如下,当前目录有两个文件:
#ls
aaa ?bbb
接下来我们将它们文件名都带一个.txt并打印出来:
ls | awk '{print $0=$0".txt"}'
效果:
aaa.txt
bbb.txt
注意,print这里使用$1也可以($2就不行了),但如果前面是用 ll 命令查询,则后面只能用$0得到文件。
此时仅是打印出来看看长什么样,文件名其实没有变。如果要实际更改文件名,则结合使用mv命令通过管道执行:
ls | awk '{print "mv",$0,$0".txt"}' | bash
效果:
#ls
aaa.txt ?bbb.txt
10,删除空格或指定字符
删除每行开头的所有空格
awk 'sub(/^ */, "")' ccc
如果去掉*,则仅去除每行第一个空格。同时注意,此操作不会实际修改文件,仅打印展示。
或:
awk 'sub(/^[ ]*/, "")' ccc
删除每行开头的所有空格和中划线
awk 'sub(/^[ -]*/, "")' ccc
文章来源:https://blog.csdn.net/HYZX_9987/article/details/135152255
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!