awk用于unix的文本处理,经常出现和使用。读取每一行文本进行格式化输出。
测试环境 Macos
awk简单操作
默认使用空格进行字符串分割
echo '1 2 3' |awk '{print $0}' # 1 2 3
echo '1 2 3' |awk '{print $3}' # 3
echo -e "1\n2\n3" |awk '/[23]/' #正则条件查找
echo -e "abc\n1a2\n33" |awk '/a/' #正则条件查找字母a
awk '{print $3}' file_path #指定文件
ls -alh|awk '/^d/' #输出目录
# drwxr-xr-x 3 panc staff 96B 7 16 23:32 pt-program
echo '1-2-3' |awk -F '-' '{print $2}' #指定分割符号 - 输出 2
表示当前行
表示第一个分割的字段
awk命令后面跟操作的语句字符串包裹,每个语句段落用花括号包裹,语句段落中用分号分隔语句。
echo -e '1 2 3\n4 5 6' |awk '{print $0;print("-end-")}'
echo -e '1 2 3\n4 5 6' |awk '{print $0;}{print("-end-")}'
#上面输出结果相同
#1 2 3
#-end-
#4 5 6
#-end-
echo -e '1 2 3\n4 5 6' |awk '{print $1,$3}'
#输出
#1 3
#4 6
使用内置变量
表示当前行有多少个分割字段
echo '1-2-3' |awk -F '-' '{print $(NF)}' # 3 获取最后一个分割字符
echo '1-2-3' |awk -F '-' '{print $(NF-1)}' # 2 获取倒数第二个分割字符
其他变量
表示当前处理的是第几行
BEGIN预处理
在执行处理之前提前设置一些信息
比如之前的参数可以使用BEGIN来设置
echo -e "a-b-c" |awk 'BEGIN{FS="-"} /^a/{print $0}' #设置分割符为-
echo -e "a-b-c" |awk 'BEGIN{FS="-";print "this title::"} {print $0}' #设置输出的首行标题
echo -e "1122\n3344" |awk 'BEGIN{FIELDWIDTHS="2 2";} {print $1,$2}' #固定字段宽度 (mac os中测试失败)
#输出
#11 22
#33 44
内置变量
FS字段分隔符
FIELDWIDTHS指定字段宽度
ORS指定输出的行分隔符
if逻辑处理
awk还可以支持函数和复杂的逻辑处理,完全可以在里面定义函数 调用 判断
例子:
显示红色error
绿色seccess
白色log
echo -e 'success\nerror\nsuccess\nloginfo' | awk \
'{
if (/error/) {
print "\033[91m" $0 "\033[0m"
} else if (/success/){
print "\033[32m" $0 "\033[0m";
}else{
print $0
}
next;
}'
上面语句有换行的段落方便阅览。一行简写也是可以
例子:
判断值大小
echo -e '12\n14\n232\n90' |awk '{if($0>=90) print $0}' #输出>=90的数据
#232
#90
for循环
使用for循环计算求和
echo '5' |awk '{ \
total = 0
for (var = 1; var < $0; var++)
{
total += var
}
print "total:",total
}'
Built-In Functions函数使用
awk中语义中支持函数的使用
echo -e 'H htjim\nDot\ncom\n009' |awk '{print toupper($0)}'#转换为大写
内置函数
toupper 转换为大写
tolower 转换为小写
rand 随机数
其他函数参考手册:
https://www.gnu.org/software/gawk/manual/html_node/Built_002din.html#Built_002din
自定义函数
自定义彩色文字输出函数awk内部执行调用
echo -e 'success\nerror\nsuccess\nloginfo' | awk \
'
function red(s) {
printf "\033[1;31m" s "\033[0m "
}
function green(s) {
printf "\033[1;32m" s "\033[0m "
}
function blue(s) {
printf "\033[1;34m" s "\033[0m "
}
{
if (/error/) {
print red($0)
} else if (/success/){
print green($0)
}else{
print blue($0)
}
}'
其他例子
结合显示红色报错提示
tail -f test.log | awk '{
if (/success/) {
print "\033[91m" $0 "\033[0m"
} else {
print "\033[32m" $0 "\033[0m";
}
next;
}';
用于直接跳到下一行文本进行执行 有点的意思
参考:
https://likegeeks.com/awk-command/
http://www.ruanyifeng.com/blog/2018/11/awk.html
https://www.cnblogs.com/Linuxprobe/p/5745381.html