`

awk getline

阅读更多
awk getline开始一直用做按行读取文件。
getline还有其他一些比较好用的功能,他可以集成shell命令,而不使用system就可以
做到:
比如想删除一个文件a里面按行存放的文件名得所有文件,那么在awk里面可以使用:
awk '{cmd="rm "$0|getline} a


下面是转自:http://bbs.chinaunix.net/thread-108596-1-1.html
的一些用法介绍:
1、getline用法简介:
getline 是awk里用于输入重定向的一个函数,他可以从标准输入/一个管道/文件读取输入, 而不只是从当前被处理的文件来处理, 他取得输入的下一行并给NF,NR,FNR等内制变量置值, 如果找到一条记录则getline返回1,如果到了文件结束(EOF)则返回0,如果错误则返回-1
man bash: search about getline
getline < file sets $0 to the next record from
      file.  getline x sets variable x instead.
...
In all cases, getline returns 1 for a
      successful input, 0 for end of file, and -1 for an error.
awk的 getline语句用于简单地读取一条记录。如果用户有一个数据记录类似两个物理记录,那么getline将尤其有用。它完成一般字段的分离(设置字段变量$0 FNR NF NR)。如果成功则返回1,失败则返回0(到达文件尾)。如果需简单地读取一个文件,则可以编写以下代码:
例:示例getline的使用
{while(getline==1)
{
#process the inputted fields
}
}

也可以使getline保存输入数据在一个字段中,而不是通过使用getline variable的形式处理一般字段。当使用这种方式时,NF被置成0,FNR和NR被增值。
用户也可以使用getline<"filename"方式从一个给定的文件中输入数据,而不是从命令行所列内容输入数据。此时,getline将完成一般字段分离(设置字段变量$0和NF)。如果文件不存在,返回-1,成功,返回1,返回0表示失败。用户可以从给定文件中读取数据到一个变量中,也可以用stdin(标准输入设备)或一个包含这个文件名的变量代替filename。值得注意的是当使用这种方式时不修改FNR和NR。
另一种使用getline语句的方法是从UNIX命令接受输入,例如下面的例子:

例:示例从UNIX命令接受输入
{while("who -u"|getline)
{
#process each line from the who command
}
}

当然,也可以使用如下形式:

"command" | getline variable
例如:

/home/lee#awk 'BEGIN{"date"|getline var;split(var,a);print a[4]}'
16:46:26
/home/lee#awk 'BEGIN{getline name<"/dev/tty";print "yourname:"name}'
lee
yourname:lee

getlin在不同环境下设置的值:
-------------------------------------------------
形式                            设置
-------------------------------------------------
getline                        $0,NF,NR,FNR
getline var                    var,NR,FNR
getline<file                   $0,NF
getline var<file               var
"cmd"|getline                  $0,NF
"cmd"|getline var              var


==================================================================================
2、getline 用法举例:
#awk中getline获取shell命令的执行结果(不是返回值)
June@~ 21:34:59>
echo |awk '{"echo \"1 + 2\"|bc"|getline v;print v}'
3
June@~ 21:35:02>
注意:awk中使用管道调用shell命令结束后一定要close("cmd")
案例分析请见: http://hi.baidu.com/leejun_2005/blog/item/88f7b9838e794785f703a60b.html

通过在awk内使用管道,可以把shell命令的输出传送给awk
$ awk 'BEGIN{ "date" | getline date; print date; }'
Sun Mar 8 22:21:52 2009

#getline的状态返回值可以被赋值
awk '{if($6!~/6/){tmp=$0}if($6~/6/){c=getline s;if(c==0)s="";print tmp,$0,s}}' file 

awk getline接收用户输入,有两种形式:
getline string  < "/dev/tty"
getline string  < "-"
1)提示用户输入参数getline:awk 'BEGIN{print "input sth";getline var <"-" ; print var}'  # 其中 "-" 就是标准输入,很多工具都支持 "-" ,比如tar/cat等。
2)获取awk脚本的位置参数:awk 'BEGIN{print ARGV[1],ARGV[2]}' a b

getline怎样保存shell的全部输出:
awk 'BEGIN{srs=RS;RS="";"ls ./" | getline TMP;RS=srs;print TMP}'

getline直接读取文件,注意BEGIN是预处理部分,不是action部分,此时还没有准备处理文件,指针也没有指向文件第1行,在执行过程中也不会移动文件指针的。简单的说就是BEGIN部分awk是没有指针的,此时只有getline指针,awk只在 { } action部分有指针处理。
awk 'BEGIN{while (getline d<"aa") print d}'

seq 10|awk '{getline d<"aa";print d}'   #如果getline直接读一个文件,那么就是逐行读取的,因为此时只有getline指针,而没有awk指针来处理该文件。


getline打印偶数行:
seq 10 | awk '{getline;print}'  # 注意这个和 seq 10 | awk 'BEGIN{while(getline)print}' 有区别!
June@~ 23:07:23>
seq 10 | awk 'i++%2'
2
4
6
8
10
June@~ 23:07:27>

awk getline两行互换:
seq 10 | awk '{if(getline tmp)print tmp;print}'   #一般就是判断getline的返回值 > 0 的
2
1
4
3
6
5
8
7
10
9

awk中通过system也可执行shell命令:system会返回状态码
awk 'BEGIN{ system("ls -l") }'
ps:system里面也可以利用awk的变量:system("echo ", $1)
分享到:
评论

相关推荐

    AWK脚本学习文档 Linux

    AWK可以读取和写入文件,利用`getline`函数可以从其他文件中获取数据: ```awk getline var ``` 而`print`或`printf`可以将结果输出到文件: ```awk print &gt; "output.txt" ``` **八、AWK脚本实例** 以下是一个...

    Effective awk Programming, 4th Edition[awk高效编程4版]

    书中详细介绍了内置函数,如printf和getline,以及如何使用print和next命令。同时,还讲解了如何处理文件和管道,与其他Unix工具结合使用,实现更强大的数据处理流程。 最后,书中提供了大量示例和实战练习,帮助...

    The AWK Programming Language 中文版

    输入分隔符可以自定义,多行记录的处理可以通过 `getline` 函数来实现。输出方面,AWK提供了 `print` 和 `printf` 语句,并能将输出重定向到文件或者管道。 ### AWK在数据处理中的应用 在数据转换和归约方面,AWK...

    AWK学习笔记.doc

    AWK可以使用`getline`命令从其他文件或管道中读取数据,以及使用`print`和`printf`进行复杂的输出格式化。 **一.12 AWK与SHELL SCRIPT混合编程** AWK脚本可以嵌入到shell脚本中,与其他Unix工具配合使用,实现更...

    awk用法小结--有关awk的材料

    对于 Solaris 操作系统而言,推荐使用 **nawk**,因为它相比旧版的 awk 增加了许多重要的功能,如支持数学运算中的幂运算 `^`、函数 `getline` 和 `system` 等。 #### 三、awk的基本语法及内部变量 **awk** 的基本...

    Awk入门教程 《Awk A Tutorial and Introduction - by Bruce Barnett》

    The Getline function The systime function The Strftime function User Defined Functions AWK patterns Formatting AWK programs Environment Variables ARGC - Number or arguments (NAWK/GAWK) ARGV - ...

    AWK 中文教程

    ### AWK 中文教程知识点概览 #### 一、AWK简介与背景 - **AWK** 是一种脚本语言,专门设计用于处理文本数据,尤其是格式化的数据(如CSV文件)。它最初由贝尔实验室的Alfred Aho、Peter Weinberger和Brian ...

    Linux/Unix AWK详细用法中文图解

    2. `getline`从输入源读取一行,可用于读取外部文件或其他命令的输出。 通过学习和实践AWK,你可以高效地处理结构化文本,解决各种数据分析和文本处理问题。结合图解教程,理解并掌握AWK的用法将极大地提升你在...

    sed and awk 101 hacks.pdf

    **使用printf格式化输出、awk内置数值函数、随机数生成器、常用字符串函数、GAWK/NAWK的字符串函数、处理参数、OFMT、GAWK内置的环境变量、pgawk...输出摆脱语言依赖、双向管道、系统函数、时间函数、getline命令**...

    awk.cheat.sheet

    ### AWK 快速参考指南 #### 一、概述 AWK 是一款强大的文本处理工具,由 Alfred V. Aho、Peter J. Weinberger 和 Brian W. Kernighan 在 20 世纪 70 年代末共同开发。AWK 语言的主要功能在于能够方便地对数据进行...

    awk学习资料最近整理的资料

    9. **文件操作**:awk可以打开和读取多个文件,使用`getline`命令逐行读取,或者在`BEGINFILE`和`ENDFILE`规则中处理文件。 10. **自定义函数**:用户可以定义自己的函数,提高代码的复用性和可读性。 11. **模式...

    awk 使用手册

    例如,使用`getline`函数读取其他文件,或通过`print`将结果输出到文件。 ### 9. `gawk` 和 `nawk` `gawk`是GNU版本的`awk`,提供了更多的功能和扩展,如GNU特定的函数、自定义内存管理等。`nawk`(new awk)是另...

    AWK使用手册.pdf

    - **内置函数**:AWK提供了一系列内置函数来处理文本,如print、printf、getline等。 ### 示例说明 文档中提到了一些基本的使用示例和语法,这里简要介绍: - **关联数组**:在AWK中,关联数组可以使用字符串作为键...

    一分钟学awk够用

    - **从文件中读取变量到 AWK 中**:使用 getline 函数。 **示例**:在 AWK 中使用 Shell 定义的变量。 ```sh #!/bin/bash STR="hello" echo | awk -v str="$STR" '{ print str; }' ``` **示例**:在 AWK 中运行 ...

    Effective AWK Programming.pdf

    11. **GNU Awk特定特性**:GAWK提供了许多其他AWK实现不支持的扩展,如三元运算符、函数参数列表和`getline`从管道和命令读取。 12. **GNU Free Documentation License**:本书遵循GNU自由文档许可证,允许自由复制...

    UNIX 下AWK编程起步教程

    - 可以通过`&lt;&gt;`操作符直接读写文件,或者使用`getline`函数从其他文件读取内容。 9. **模式匹配** - 正则表达式是AWK的强大工具,允许复杂的数据匹配。 - 使用`~`和`!~`操作符进行正则匹配。 10. **数组处理** ...

Global site tag (gtag.js) - Google Analytics