前段时间看了一下awk的使用选项,字段变量,标准变量,操作运算符,正则表达式,数组和控制流,并且也附带着一些相关的案例,总的来说,在深入了解和使用AWK之后,还是带来了很多的便利,在处理文本的文件的时候提供了更多的思路和便捷,比如按需自定义打印文本显示格式,进行一些简单的数据处理,同时awk还有和shell,python,go一些编程语言类似的循环,条件,逻辑处理,以及一些内置的函数更方便的帮助在命令行完成一些文本处理工作。今天完成了awk剩余的一些知识点学习。
格式: for(initialisation;condition;increment/decrement)action
for 语句首先执行初始化动作( initialisation ),然后再检查条件( condition )。如果条件为真,则执行动作( actio n ),然后执行递增( increment )或者递减( decrement )操作。只要条件为真循环就会一直执行。每次循环结束 都会进条件检查,若条件为假则结束 循环
awk 'BEGIN { for (i = 1; i <= 5; ++i) print i }' # 注意这里是++i,不是i++
While 循环会一直执行动作直到逻辑条件为假为止,AWK 首先检查条件是否为真,若条件为真则执行动作。此过程一直重复直到条件为假时,则停止
awk 'BEGIN {i = 1; while (i < 6) { print i; ++i } }' # 等同上面的for语句
Do-While 循环与 While 循环相似,但是 Do-While 的条件测试放到了循环的尾部,在 do-while 循环中,无论条件是真是假,循环语句至少执行一次,执行后检查条件真假,使用格式如下:
do action
while (condition)
看一个案例:
awk 'BEGIN {i = 1; do { print i; ++i } while (i < 6) }'
break 用以结束循环过程
awk 'BEGIN {
sum = 0; for (i = 0; i < 20; ++i) {
sum += i; if (sum > 50) break; else print "Sum =", sum }
}'
Continue 语句用于在循环体内部结束本次循环,从而直接进入下一次循环迭代。当我们希望跳过循环中某处数据 处理时就会用到 Continue
awk 'BEGIN {for (i = 1; i <= 20; ++i) {if (i % 2 == 0) print i ; else continue} }'
Exit 用于结束脚本程序的执行。该函数接受一个整数作为参数表示 AWK 进程结束状态。如果没有提供该参数,其默认状态为 0
awk 'BEGIN { 10022 12:34:02
sum = 0; for (i = 0; i < 20; ++i) {
sum += i; if (sum > 50) exit(10); else print "Sum =", sum }
}'
Sum = 0
Sum = 1
Sum = 3
Sum = 6
Sum = 10
Sum = 15
Sum = 21
Sum = 28
Sum = 36
Sum = 45
root # echo ? #查看期退出的状态码为指定的10
10
AWK 为程序开发者提供了丰富的内置函数。包括算术函数、字符串操作函数、时间操 作相关的函数、位操作函数以及其它各种各样的函数
awk 'BEGIN{printf "The exponential value of 5 is %f.\n",exp(5)}'
awk 'BEGIN {printf "34.1212的整数部分是: %d",int(34.1212)}'
awk 'BEGIN {param=4.232;result=int(param);printf "整数部分是:%d",result}'
awk 'BEGIN { param = 10
printf "srand() = %d\n", srand()
printf "srand(%d) = %d\n", param, srand(param) }'
注意mac上的awk 20070501版本没有该函数
awk 'BEGIN {
arr[0] = "Three"
arr[1] = "One"
arr[2] = "Two"
print "Array elements before sorting:";
for (i in arr) {
print arr[i]
}
asort(arr)
print "Array elements after sorting:"
for (i in arr) {
print arr[i]
}
}'
awk '{gsub("172.16.132.148","0.0.0.0");print }' docker-compose.yml # 替换docker-compose.yml中的172.16.132.148为0.0.0.0
awk 'BEGIN {
str = "One Two Three"
subs = "Two"
ret = index(str, subs)
printf "Substring \"%s\" found at %d location.\n", subs, ret }'
awk 'BEGIN {
str = "One,Two,Three,Four"
split(str, arr, ",")
print "Array contains following values"
for (i in arr) { print arr[i]
} }'
awk 'BEGIN {
str = sprintf("%s", "Hello, World !!!")
print str }'
root@dev-node1:~# awk 'BEGIN {
> print "Decimal num = " strtonum("123")
> print "Octal num = " strtonum("0123")
> print "Hexadecimal num = " strtonum("0x123")
> }'
Decimal num = 123
Octal num = 83
Hexadecimal num = 291
root@dev-node1:~# awk 'BEGIN {
str = "Hello, World !!!"; subs = substr(str, 1, 5);
print "Substring = " subs }'
Substring = Hello
root@dev-node1:~# awk 'BEGIN {
str = "Hello, World !!!"; subs = substr(str, 1);
print "Substring = " subs }'
Substring = Hello, World !!!
awk 'BEGIN { num1 = 10
printf "lshift(%d) by 1 = %d\n", num1, lshift(num1, 1) }'
awk '{if ($0 ~/Shyam/) next; print $0}' marks.txt
awk '{ if ($0 ~ /file1:str2/) nextfile; print $0 }' file1.txt file2.txt
cat << EOF >> functions.awk
function addition(num1, num2) {
result = num1 + num2
return result }
BEGIN {
res = addition(10, 20) print "10 + 20 = " res
}
EOF
awk 'BEGIN { ret = system("date"); print "Return value = " ret }'
awk 'BEGIN { print "Hello, World !!!" > "/tmp/message.txt" }'
awk 'BEGIN { print "Hello, World !!!" > "/tmp/message.txt" }'
awk 'BEGIN { print "hello, world !!!" | "tr [a-z] [A-Z]" }'
BEGIN {
cmd = "tr [a-z] [A-Z]"
print "hello, world !!!" |& cmd close(cmd, "to")
cmd |& getline out
print out;
close(cmd);
}