今天被面试有个问题一脸懵逼……(。ì _ í。)
awk……这是啥 没用过aaaaa…… But,不会不怕 学就可以了嘛~
一、awk是什么
linux下的文本、数据处理工具
二、awk使用方式
**1.命令行方式 (三、里面会点详细说明)
awk [-F field-separator] + 'awk命令' + awk_test.txt
[-F域分隔符]可选,文件的每一行中,由-F分开的每一项称为一个域。
2.shell脚本方式
将所有的awk命令插入一个文件,并使awk程序可执行,首行使用#!/bin/awk
3.将所有的awk命令插入一个单独文件,然后调用
awk -f script.awk awk_test.txt
其中,-f选项加载script.awk中的awk脚本
三、使用语法
awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file
BEGIN: 初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符
//:正则或字符串,匹配代码块
{}:包含一条或多条命令,多条命令使用分号分隔
END:结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾信息
#常用内置变量(反正我是背不下来 会用就行了。。。)
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
*FS 设置输入域分隔符,等价于命令行 -F选项
*NF 经过-F分割之后,每行的个数
*NR 行数
*OFS 输出域分隔符(print $1,$2时使用)
ORS 输出记录分隔符
RS 控制记录分隔符
————————————————————————————
————————————————————————————
举例说明
#eg:awk_test.txt
11111 --22222 --33333--4444--5555--6666
11111, 22222, 33333-- 4444-- 5555-- 6666
11111: 22222: 33333-- 4444-- 5555-- 6666
1、-F是什么鬼,$n是什么
#awk -F'-- ' '{print $1 $2}' awk_test.txt
#$1和$2代表第一列、第二列(默认每行按空格分割,这里按'-- '分割,$1 $2为分割后的)
11111 --22222 --33333--4444--5555--6666
11111, 22222, 333334444
11111: 22222: 333334444
#awk -F'-- ' '{print $1,$2}' awk_test.txt
11111 --22222 --33333--4444--5555--6666
11111, 22222, 33333 4444
11111: 22222: 33333 4444
敲黑板:
i、print $1 $2 和 print $1,$2 是不一样的!
空格这种:连续输出
逗号这种:输出后按空格分割,如果想修改,使用awk -F’-- ’ ‘{print $1,$2}’ OFS=’…’ awk_test.txt
ii、$0代表一行 $n 代表-F分割之后的第n段
2、应用
- 2.1 输出第一列的和:
awk 'BEGIN {count=0} {count=count+$1;} END{print count}' awk_test.txt
#输出:33333
- 2.2 打印某个文件夹下的文件占用的字节数:
ls -l |awk '{print $5}'
- 2.3 统计某文件夹下的文件占用的字节数,输出文件大小>1024Byte的文件(一般都是文件夹),输出这些文件个数:
ls -l |awk 'BEGIN {size=0;count=0;print "start"} {if($5>1024){count=count+1; print"size: ", $5/1024, "K";}} END{print "[end]count=", count}'
#输出如下:
start
size: 1.46094 K
size: 1.92578 K
[end]count= 2
- 2.4 与其他命令连起来用,删除所有符合条件的docker container进程
docker ps -a |grep 条件 |awk '{print $1}' |xargs docker rm