linux

xiaoxiao2021-02-28  53

综述

是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}

模式

用来选择符合要求的行。也可以没有模式,只有动作。 通过列来选择行。 nn1 0表示所有的行

// 选择第三列值>3的所有行 $3>0 // 选择所有内容 $0 // == 选择指定内容的 $1 = "Mark" // 使用与或非等逻辑运算 $1 == "Mark" || $1 == "Mary" !($3>0)

动作

print

在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 -n

ifelse

if(exp) sentence1 else sentence2

循环

while while(exp) {sentence}

for for(var in seq){ sentence }

do do {sentence} while (condition)

运算符

> < == >= != || && ~ ~!

内建变量

$0 所有内容 $N 第N列 FS 输入字段(列)分隔符。指定输入字段的分隔符 NF 当前字段的个数(列数) NR 添加行号 FNR 每个文件各自的行号 RS 输入的记录(行)分隔符 OFS 输出字段分隔符 ORS输出记录分隔符

文件操作

awk 'NR!=1 {print $n> "输出文件名"}' file

IO

next 如果遇到next,就会跳过当前行,直接忽略下面语句。而进行下一行匹配。next语句一般用于多行合并: // 遇到行号是偶数就跳过 awk 'NR/2 == 1{next}{print NR,$0} ' awk1.txt getLine 1行读取成功:返回1 到文件末尾:返回0 异常:返回-1 // 获取时间并输出 awk 'BEGIN{'date' | getline out;print out}' test close 关闭文件
转载请注明原文地址: https://www.6miu.com/read-78436.html

最新回复(0)