awk语法格式 awk -f awk.sh file# 执行脚本awk.sh ./awk.sh file# 执行脚本awk.sh,脚本以#!/bin/awk开头 awk '{}' file# awk命令行模式,嵌入shell脚本中 awk BEGIN{action}'/pattern/{action}'END{action}file# awk语法格式 awk '/^North/'file# 打印以North开头的行(无操作语句) awk '{print $0}'# 批印所有行(无模式语句) awk '/^North/{print $0}' file# 打印以North开头的行 awk '/^North/,/^West/{print $0}' file# 打印以North至West开头之间的行 awk '{print $1,$2,$3}' file# 打印域1 域2 域3,以空格分开 awk '{print $1 $2 $3}' file# 打印域1 域2 域3,不以空格分开 其中/ /为模式,{ }为动作。awk仅针对匹配的行执行动作(没有模式代表所有行),行匹配后执行{ }中的动作(没有动作默认打印到输出) awk 记录、字段 行称作记录,默认以回车符(换行符)作为记录分隔符 域称作字段,默认以空格、制表符作为域分隔符 $0 整行 $1 域1 $2 域2 RS 输入记录分隔符 ORS 输出记录分隔符 FS 输入字段分隔符 OFS 输出字段分隔符 NR 记录号 NF 字段数 awk -F: # 指定域分隔符为: awk -F [ :\t] # 指定域分隔符为空格或: 或制表符 awk 正则表达式 ^ 行首 $ 行尾 . 单个任意字符 * 0或多个前导字符 + 1或多个前导字符 ? 0或1个前导字符 (ab) +1或多个前导字符串 [abc] a或b或c [^abc] 不是a或b或c a|b a或b \* 转义,代表*本身 & 替代串,代表查找串中匹配到的内容 ~ 模式匹配操作符 !~ 模式否定匹配操作符 awk的正则表达式,主要用于模式中,用于筛选记录,示例如下: northwestNWJoel Craig3.0.9834 westernWESharon Kelly5.3.97523 southwestSWChris Foster2.7.8218 southernSOMay Chin5.1.95415 southeastSEDerek Johnson4.0.7417 easternEASusan Beal4.4.84520 northeastNETJ Nichols5.1.94313 northNOVal Shultz4.5.8959 centralCTSheri Watson5.7.94513 awk '/^n/{print $0}' # 打印n开头的行 awk '$2 ~/^N/{print $0}' # 打印域2以N开头的行,~为模式匹配操作符,!~取反 printf函数 printf修饰符 - 左对齐 #8 进制前面加0,16进制前面加0x printf格式说明符 %d 10进制数 %f 浮点数 %s 字符 printf转义符 c 字符 s 字符串 d 10进制数 f 浮点数 x 16进制数 echo "UNIX" | awk '{printf "%-15s\n",$1}' # %让printf作准备,-左对齐占,15占位15,s字符,\n换行符;整个格式说明用””,格式说明与被格式字符串或域用, awk '{printf "The name is: %-15s ID is %8d\n",$1,$2}' # %-15s 格式化$1,%8d\n 格式化$2 awk字符串函数 sub(正则,替换串,目标串)# $0或省略,默认仅执行记录中第1次匹配,全匹配用gsub awk '{sub(/Mac/,"Mac book",$1);print}' index(字符串,子串)# 子串在字符串中出现的位置 awk '{index($1,"Mac")}' substr(字符串,起始位置,子串长度)# 从字符串的指定长度开始截,如截到末尾,字串长度省略。 awk '{print substr($1,3,5)}' awk if语句 awk '/pattern/ { if(expr)# 表达式用(),如果为真(非0或非空),执行语句1 语句1# 1条语句 else if (expr) {语句1;语句2}#2条语句,用{}括起来,语句之间用; else {语句1#2条语句,用{}括起来,语句之间用;或回车 语句2} }' awk 循环语句 awk '{i=1;while (i<=NF){print NF,$i;i++}}' awk '{for (i=1;i<=NF;i++) print NF,$i}' i=1初始化变量 (i<=NF)测试变量i i++重新赋值i print NF,$i执行动作
|