是linux的shell三剑客之一:
grep 查找sed 编辑awk 数据分析awk本身也是一门语言,是linxu中处理字符文本的强大工具,结合sed,grep能产生强大的效果。 每个程序都是一个或多个模式动作序列。每个模式一次匹配文本的每一行。直到输入完毕。 都是用 符号操作。shell中的 后有{}号,awk一般不使用{}号。 简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。灵活性是awk最大的优势。
后续的演示和学习都用下面的例子进行,分别是awk1.txt和awk2.txt
// example1 awk1.txt Proto Recv-Q Send-Q Local-Address Foreign-Address State tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN tcp 0 0 coolshell.cn:80 124.205.5.146:18245 TIME_WAIT tcp 0 0 coolshell.cn:80 61.140.101.185:37538 FIN_WAIT2 tcp 0 0 coolshell.cn:80 110.194.134.189:1032 ESTABLISHED tcp 0 0 coolshell.cn:80 123.169.124.111:49809 ESTABLISHED tcp 0 0 coolshell.cn:80 116.234.127.77:11502 FIN_WAIT2 tcp 0 0 coolshell.cn:80 123.169.124.111:49829 ESTABLISHED tcp 0 0 coolshell.cn:80 183.60.215.36:36970 TIME_WAIT tcp 0 4166 coolshell.cn:80 61.148.242.38:30901 ESTABLISHED tcp 0 1 coolshell.cn:80 124.152.181.209:26825 FIN_WAIT1 tcp 0 0 coolshell.cn:80 110.194.134.189:4796 ESTABLISHED tcp 0 0 coolshell.cn:80 183.60.212.163:51082 TIME_WAIT tcp 0 1 coolshell.cn:80 208.115.113.92:50601 LAST_ACK tcp 0 0 coolshell.cn:80 123.169.124.111:49840 ESTABLISHED tcp 0 0 coolshell.cn:80 117.136.20.85:50025 FIN_WAIT2 tcp 0 0 :::22 :::* LISTEN // example2 awk2.txt Beth 4.00 0 Dan 3.75 0 Kathy 4.00 10 Mark 5.00 20 Mary 5.50 22 Susie 4.25 18使用 模式-动作 语句 ex:
awk ' $3 > 0 {print $1 $2 $3} {FS= " "} ' awk1.txt awk 指明使用的是awk程序awk1.txt 对awk1.txt文本进行操作‘xxxx’ 模式动作模块$3 > 0模式。利用该模式扫一遍所有的行。{print xxx} 动作。对符合条件的进行动作。{FS} 指定内建变量主要分成四部分:
awk命令操作的文本:可以有多个模式:可以没有动作:放在{}里 模式-动作部分被’ ‘单引号包围,可以方便的放在shell中使用。 在awk中可以指定分隔符(默认是空格) // 指定singla为默认分隔符 awk -F singal {xx}用来选择符合要求的行。也可以没有模式,只有动作。 通过列来选择行。 n:选择第n行。这里是从1开始编号的, 0表示所有的行
// 选择第三列值>3的所有行 $3>0 // 选择所有内容 $0 // == 选择指定内容的 $1 = "Mark" // 使用与或非等逻辑运算 $1 == "Mark" || $1 == "Mary" !($3>0)在print中可以进行数据运算,添加打印内容,添加空格等操作
// 打印所有内容 print $0 // 打印第n列 print $n // 打印字段的个数(number of field) print NF > print NF $1 > 3xxxx // 打印最后一个字段 print $(NF-1) // 打印行号(number of row) print NR $0 > print NR $1 > 1 xx // 输出排序后的内容 print $2 | sort -nif(exp) sentence1 else sentence2
while while(exp) {sentence}
for for(var in seq){ sentence }
do do {sentence} while (condition)