• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >linux shell > awk基础知识小结第1/2页

awk基础知识小结第1/2页

作者: 字体:[增加 减小] 来源:互联网

通过本文主要向大家介绍了awk,awk命令,linux awk,awk用法,awk f等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

1、使用规则

awk 适合于文本处理和报表生成,它还有许多精心设计的特性,允许进行需要特殊技巧程序设计。
awk 的语法较为常见。它借鉴了某些语言的一些精华部分,如C 语言、python 和 bash。

第一个 awk
让我们继续,开始使用 awk,以了解其工作原理。在命令行中输入以下命令:
$ awk '{ print }' /etc/passwd
您将会见到 /etc/passwd 文件的内容出现在眼前。现在,解释 awk 做了些什么。调用 awk 时,我们指定 /etc/passwd 作为输入文件。执行 awk 时,它依次对 /etc/passwd 中的每一行执行 print 命令。所有输出都发送到 stdout,所得到的结果与与执行catting /etc/passwd完全相同。

现在,解释 { print } 代码块。在 awk 中,花括号用于将几块代码组合到一起,这一点类似于 C 语言。在代码块中只有一条 print 命令。在 awk 中,如果只出现 print 命令,那么将打印当前行的全部内容。

这里是另一个awk 示例,作用与上例完全相同:
$ awk '{ print $0 }' /etc/passwd

在 awk 中,$0 变量表示整个当前行,所以 print 和 print $0 的作用完全一样。

创建一个 awk 程序,让它输出与输入数据完全无关的数据。
示例1:
$ awk '{ print "" }' /etc/passwd
只要将 "" 字符串传递给 print 命令,它就会打印空白行。测试该脚本,将会发现对于/etc/passwd文件中的每一行,awk 都输出一个空白行。由此可知,awk对输入文件中的每一行都执行这个脚本。

示例2:
$ awk '{ print "hiya" }' /etc/passwd
运行此脚本将在您的屏幕上写满 hiya。

2、处理多个字段
awk 非常善于处理分成多个逻辑字段的文本,还可以引用 awk 脚本中每个独立的字段。
打印系统上所有用户帐户的列表:
$ awk -F":" '{ print $1 }' /etc/passwd
上例中,调用awk时,使用 -F 选项来指定 ":" 作为字段分隔符。awk 处理 print $1 命令时,它会打印出在输入文件中每一行中出现的第一个字段。
以下是另一示例:
$ awk -F":" '{ print $1 $3 }' /etc/passwd

以下是该脚本输出的摘录:
halt7
operator11
root0
shutdown6
sync5
bin1
....etc.

如您所见,awk 打印出 /etc/passwd 文件的第一和第三个字段,它们正好分别是用户名和用户标识字段。现在,当脚本运行时,它并不理想--在两个输出字段之间没有空格!如果习惯于使用 bash 或 python 进行编程,那么您会指望 print $1 $3 命令在两个字段之间插入空格。然而,当两个字符串在 awk 程序中彼此相邻时,awk 会连接它们但不在它们之间添加空格。以下命令会在这两个字段中插入空格:
$ awk -F":" '{ print $1 " " $3 }' /etc/passwd

以这种方式调用 print 时,它将连接 $1、" " 和 $3,创建可读的输出。
还可以插入一些文本标签:
$ awk -F":" '{ print "username: " $1 "ttuid:" $3" }' /etc/passwd

这将产生以下输出:
username: halt          uid:7
username: operator      uid:11
username: root          uid:0
username: shutdown      uid:6
username: sync          uid:5
username: bin           uid:1
....etc.

3、调用外部脚本
将脚本作为命令行自变量传递给awk对于小的单行程序来说很简单。
而对于多行程序,则可以在外部文件中撰写脚本,然后向awk传递-f选项,以向它提供外部脚本文件的调用:
$ awk -f myscript.awk myfile.in

将脚本放入文本文件还可以使用附加awk功能。例如:
BEGIN {
      FS=":"
}
{ print $1 }
打印出 /etc/passwd 中每一行的第一个字段

在这个脚本中,字段分隔符在代码自身中指定(通过设置 FS 变量)。
在脚本自身中设置字段分隔符,可以少输入一个命令行自变量。

4、begin和end块

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

awk 还提供了另一个特殊块,叫作 END 块。awk 在处理了输入文件中的所有行之后执行这个块。通常,END 块用于执行最终计算或打印应该出现在输出流结尾的摘要信息。

5、正则表达式
awk 允许使用正则表达式,根据正则表达式是否匹配当前行来选择执行独立代码块。
输出包含字符序列foo的行:
/foo/ { print }

复杂点的,只打印包含浮点数的行:
/[0-9]+.[0-9]*/ { print }

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

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

6、条件语句
awk 还提供了非常好的类似于 C 语言的 if 语句。if 语句示例:
{
    if ( $5 ~ /root/ ) {
       print $3
    }
}
对每一个输入行执行代码块,使用 if 语句来选择执行 print 命令。
更复杂的 awk if 语句示例。
{
    if ( $1 == "foo" ) {
       if ( $2 == "foo" ) {
            print "uno"
        } else {
          print "one"
        }
          } else if ($1 == "bar" ) {
                    print "two"
                 } else {
                    print "three"
                 }
}

使用 if 语句还可以将代码:
! /matchme/ { print $1 $3 $4 }
转换成:
{
     if ( $0 !~ /matchme/ ) {
         print $1 $3 $4
     }
}
这两个脚本都只输出不包含 matchme 字符序列的那些行。

awk 还允许使用布尔运算符 "||"(逻辑与)和 "&&"(逻辑或),以便创建更复杂的布尔表达式:
( $1 == "foo" ) && ( $2 == "bar" ) { print }
这个示例只打印第一个字段等于 foo 且第二个字段等于 bar 的行。

7、变量
awk的变量,数值变量与字符串变量。

数值变量
至今,我们不是打印字符串、整行就是特定字段。然而,awk还可以执行整数和浮点运算。使用数学表达式,可以很方便地编写计算文件中空白行数量的脚本。
BEGIN   { x=0 }
/^$/    { x=x+1 }
END     { print "I found " x " blank lines. :}" }
在 BEGIN 块中,将整数变量 x 初始化成零。然后,awk 每次遇到空白行时,awk 将执行 x=x+1 语句,递增 x。
处理完所有行之后,执行 END 块,awk 将打印出最终摘要,指出它找到的空白行数量。

字符串化变量
awk 的优点之一就是“简单和字符串化”。我认为 awk 变量“字符串化”是因为所有 awk 变量在内部都是按字符串形式存储的。同时,awk 变量是“简单的”,因为可以对它执行数学操作,且只要变量包含有效数字字符串,awk 会自动处理字符串到数字的转换步骤。要理解我的观点,请研究以下示例:
x="1.01"
# We just set x to contain the *string* "1.01"
x=x+1
# We just added one to a *string*
print x
# Incidentally, these are comments :)
awk 将输出:
2.01

虽然将字符串值 1.01 赋值给变量 x,仍然可以对它加一。但在 bash 和 python 中却不能这样做。
首先,bash 不支持浮点运算。而且,如果 bash 有“字符串化”变量,它们并不“简单”;要执行任何数学操作,bash 要求我们将数字放到丑陋的 $( ) ) 结构中。
如果使用 python,则必须在对 1.01 字符串执行任何数学运算之前,将它转换成

您可能想查找下面的文章:

  • linux文本分析awk基础命令介绍(8)
  • linux Shell脚本里面把一个数组传递到awk内部进行处理
  • linux Shell脚本里面把一个数组传递到awk内部进行处理
  • linux awk高级应用实例
  • 一天一个shell命令 linux文本内容操作系列-awk命令详解
  • linux awk时间计算脚本及awk命令详解
  • linux awk时间计算脚本及awk命令详解
  • Linux之split命令详解
  • awk正则表达式和内置函数的使用方法实例详解
  • awk中实现ord函数功能

相关文章

  • Shell逐行读取文件的4种方法
  • 一个简单的linux命令 pwd
  • CentOS 6.x系统升级Python到2.7版本的Shell脚本分享
  • shell脚本中28个特殊字符的作用简明总结
  • bash scp command not found的解决方法
  • Linux Shell脚本系列教程(七):脚本调试
  • linux获取系统启动时间示例详解
  • kill特定进程的shell脚本代码
  • shell编程基础之认识与学习BASH
  • Linux makefile 和shell文件相互调用实例详解

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • Shell中判断字符串是否为数字的6种方法分享
    • Shell脚本实现乱序排列文件内容的多种方法(洗牌问题)
    • Shell、Perl、Python、PHP访问 MySQL 数据库代码实例
    • Shell中的for循环总结
    • shell脚本学习指南[五](Arnold Robbins & Nelson H.F. Beebe著)
    • Shell时间运算及时间差计算方法
    • linux shell自定义函数(定义、返回值、变量作用域)介绍
    • shell编程中的字符串截取方法小结
    • 一个监控网卡流量的shell脚本
    • 5个实用的shell脚本面试题和答案

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有