zoukankan      html  css  js  c++  java
  • awk实用技巧

    第一个 awk

    打印文本

    shell> awk '{ print }' /etc/passwd
    

    打印空白行

    只要将 "" 字符串传递给 print 命令,它就会打印空白行。 如果测试该脚本,将会发现对于/etc/passwd 文件中的每一行,awk 都输出一个空白行。 再次说明, awk 对输入文件中的每一行都执行这个脚本。

    # 对每一行都执行输出 "" (空白)
    shell> awk '{ print ""}' /etc/passwd
    
    ### 对每一行都执行haiyi
    shell> awk '{ print "haiyi"}'
    

    多个字段

    指定分隔符

    在调用 awk 时,使用 -F 选项来指定 ":" 作为字段分隔符。awk 处理 print $1
    命令时,它会打印出在输入文件中每一行中出现的第一个字段

    shell> awk -F":" '{ print $1 }' /etc/passwd
    shell> awk -F":" '{ print $1 $3 }' /etc/passwd
    

    当两个字符串在 awk 程序中彼此相邻时,awk 会连接它们但不 在它们之间添加空格

    shell>  awk -F":" '{ print $1 " " $3 }' /etc/passwd
    root 0
    bin 1
    daemon 2
    adm 3
    

    输出标签

    shell> awk -F":" '{ print "username: " $1 "		uid:" $3 }' /etc/passwd
    username: root		uid:0
    username: bin		uid:1
    username: daemon		uid:2
    username: adm		uid:3
    

    BEGIN和END模块

    BEGIN模块

    通常,对于每个输入行,awk 都会执行每个脚本代码块一次。然而,在许多编程情况中, 可能需要在 awk 开始处理输入文件中的文本之前执行初始化代码。对于这种情况,awk 允许您定义一个 BEGIN 块。我们在前一个示例中使用了 BEGIN 块。因为 awk 在开 始处理输入文件之前会执行 BEGIN 块,因此它是初始化 FS(字段分隔符)变量、打 印页眉或初始化其它在程序中以后会引用的全局变量的极佳位置。

    END模块

    awk 还提供了另一个特殊块,叫作 END 块。awk 在处理了输入文件中的所有行之后 执行这个块。通常,END 块用于执行最终计算或打印应该出现在输出流结尾的摘要信 息。规则表达式和块 awk 允许使用规则表达式,根据规则表达式是否匹配当前行来选 择执行独立代码块。以下示例脚本只输出包含字符序列 foo 的那些行

    例子

    只输出包含字符序列 root 的那些行

    shell> awk '/root/{ print }' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    

    可以使用更复杂的规则表达式。以下脚本将只打印包含浮点数的行:

    shell> awk  '/[0-9]+.[0-9]*/ { print }' /etc/init.d/functions
    delay=$(echo $2 | awk -v RS=' ' -v IGNORECASE=1 '{if($1!~/^[0-9.]+[smhd]?$/) exit 1;d=$1~/s$|^[0-9.]*$/?1:$1~/m$/?60:$1~/h$/?60*60:$1~/d$/?24*60*60:-1;if(d==-1) exit 1;delay+=d*$1} END {printf("%d",delay+0.5)}')
    

    我们可以将任意一种布尔表达式放在一个代码块之前,以控制何时执行某特定块。仅当对前面的布尔表达式求值为真时, awk 才执行代码块。以下示例脚本输出将输出其第一个字段等于 root 的所有行中的第 三个字段。如果当前行的第一个字段不等于 root,awk 将继续处理文件而不对当前行执 行 print 语句:

    shell> awk -F ":" ' $1 == "root" { print $3 }' /etc/passwd
    0
    

    awk 提供了完整的比较运算符集合,包括 "=="、"<"、">"、"<="、">=" 和 "!="。另外,
    awk 还提供了 "~"
    和 "!~" 运算符,它们分别表示“匹配”和“不匹配”。它们的用法是在运算符左边指定 变量,在右边指定规则表达式。如果某一行的第五个字段包含字符序列 root,那么以下 示例将只打印这一行中的第三个字段

    shell> awk -F ":" ' $1 ~ /root/ { print $3 }' /etc/passwd
    0
    

    条件语句

    { if ( $1 == "foo" ) {if ( $2 == "foo" ) { print "uno" } else {print "one" }}
    else if ($1 == "bar") {print "two"} else {print "three" }}
    

    awk 获取shell变量

    var="this is a test" 
    awk -v nvar="$var" '{print nvar}'
    
  • 相关阅读:
    HDU 4396
    Vijos1603 迷宫
    BZOJ1087 [SCOI2005] 互不侵犯King
    BZOJ2208 [JSOI2010] 连通数
    BZOJ1051 [HAOI2006] 受欢迎的牛
    BZOJ2751 [HAOI2012] 容易题(easy)
    BZOJ1015 [JSOI2008] 星球大战starwar
    BZOJ1012 [JSOI2008] 最大数maxnumber
    BZOJ1050 [HAOI2006] 旅行comf
    BZOJ2761 [JLOI2011] 不重复数字
  • 原文地址:https://www.cnblogs.com/Csir/p/8535171.html
Copyright © 2011-2022 走看看