Shell-awk

【Shell-awk】
文章目录

      • 1. AWK
        • 1. 基础知识
        • 2. awk常见的内建变量
        • 3. awk标准选项
        • 4. awk条件判断(&& || !)
        • 5. awk循环
        • 6. awk执行流程
        • 7. 小案列

1. AWK
1. 基础知识
  1. print $0的含义是打印整行,输出到stdout。
  2. -F参数设置的是awk的初始化变量FS(我们在后面的章节将讲到这个变量)。FS变量控制着awk的字段分隔符,默认情况下是空白字符。
  3. 在BEGIN代码块中,完成awk部分参数的初始化操作。END代码块,它是在所有的输入都处理完后awk运行的代码。
  4. awk的变量在建立时的初始值都是空字符串,但是当需要数值时,它会被视为0。
  5. awk允许在数组名称之后,以方括号将任意数字或字符串表达式括起来作为索引。
  6. 数组也无需声明就能使用。数组的存储空间在引用新元素时会自动增长。
  7. delete array[index]会从数组中删除元素,而delete array会删除array数组中的所有元素。
  8. 在awk中只能使用print;不能使用echo。
  9. 在awk中使用的变量,不需要,使用$var引用变量。直接使用var即可获取到值。 、
  10. awk核心代码块的执行次数和操作文件的行数一致; BEGIN和END只会执行一次
2. awk常见的内建变量
变量 描述
FILENAME 当前输入文件的名称
FNR 当前输入文件的记录数
FS 文件分隔符(默认为空格,支持正则表达式)
NF 当前记录的字段数
NR 在工作中的记录数
OFS 输出字段分割字符
ORS 输出记录分割字符(默认为 “\n”)
RS 输入记录分割字符
ARGC 传入的参数个数 eg: awk 'BEGIN{print "Args=", ARGC}' 1 2 343 4
ARGV 传入的参数 eg: awk 'BEGIN{print "Argv1=", ARGV[1]}' 1 2 343 4;ARGV[0]为awk;从ARGV[1]开始,才是参数。
3. awk标准选项
选项 描述 示例
-v 该选项将一个值赋予一个变量,它会在程序开始之前进行赋值 awk -v name1=alex 'BEGIN{printf "name=%s\n", name1}'
4. awk条件判断(&& || !)
if (condition1 && condition2) { statement... } else if (condition1 || condition2) { statement... } else { statement... }

5. awk循环
  1. while循环
BEGIN { print "while is begin...." }{ item=1 while( item < 10 ) { item+=item } }END { print "while is end, item : " item }

  1. do…while循环
{ count=1 do { print "count: " count++ } while(count != 10) }

  1. for循环
BEGIN{ print "This is begin..." }{ for(i=1; i<=10; i++) { print "item: " i } }END { print "This is end..." }

6. awk执行流程 Created with Rapha?l 2.2.0 awk-BEGIN代码块 读取文件一行数据 执行awk代码块 是否读取文件还有剩余行? awk-END代码块 yes no 7. 小案列
  1. 设置文件分隔符。
awk –F ":" '{print "USER: "$1 "\t SHELL: "$7}'/tmp/passwd.piece

  1. 设置的分隔符为正则表达式
awk -F "[\t ]+" '{print "DEVICE: "$1 "\t FSTYPE: "$3}' /etc/fstab

  1. 符合正则表达式时,执行脚本
awk'/nologin/ {++adder}' num1.txt

  1. 使用条件判断
awk '{if ($1>100){count++; print $1} \ else{count--; print $2}}' num2.txt

  1. 使用awk脚本来执行批量的awk指令,操作文件。
num1.awk BEGIN{ FS=":" print "This is begin!" }{ if($1>100 && $1<200) { print $1 " is more than 100" } else if($1>200) { print $1" is more than 200" } else { less_than_100++ print $1 " is less than 100" } }END{ print "Less than 100, count: " less_than_100 }awk -f num1.awk num1.txt

    推荐阅读