shell脚本之awk

(一) 什么是awk

awk其实相当于一门可以处理数据文本的语言,这么说的原因是其具有很多类c语言的语法,如:变量,数组,函数,流程控制等,其由Aho,Weinberger,Kernighan大约在1977年开发完成,随后被引入unix/linux中。

(二) awk可以干什么

awk是一个非常强大的数据处理工具,可对文本进行的编辑,筛选,其非常适用于处理有行和列组成的文本数据,就像处理数据库中的记录一样,可以删除列,添加列或者删除行,修改行与添加行等一系列操作,非常实用。

(三)awk的基本语法

一般形式:awk pattern {actions} filename

  • 【pattern】:表示匹配模式。
  • 【{action}】:要执行的操作
    说明:以上语法表示当某个问本行负符合pattern指定的匹配规则时,执行action操作。
    注意:以上pattern与{actions}是可选的,但是必须有其中一个,并且action前面的左大括号需要与pattern位于同一行中,尼玛,我就吃过这一次亏,特此强调。
(四) 执行awk程序的几种方式
(1)通过命令执行awk程序

例如:
awk ‘{print}’ filename 输出filenam全部的数据
awk ‘/^T/ {print} ’ filename 输出行首为T的文本行

(2)通过awk脚本

例如:
把awk ‘/^T/ {print} ’ filename 中的’/^T/ {print} ‘写入test文本文件中,然后执行**awk -f test filename 就达到和上述一样的效果了。

(3)通过可执行程序

例如:
直接将 awk ‘/^T/ {print} ’ filename写入脚本文件test.awk中如下:

#! /usr/bin/awk -f 
'/^T/ {print} '

赋予该脚本可执行权限后,执行:./test.awk filename 就OK.

(五) awk的模式匹配,即pattern中可以使用的形式
(1)关系表达式,既可以使用> ,< ,== ,!=等关系表达式作为匹配模式,进行筛选。

例如:
awk ‘$2>80 {print}’ filename 显示第二列大于80的行。

(2)正则表达式,既可以使用[$,.,^,* ,[]]等正则表达式作为匹配模式,进行筛选。

例如:

#! /usr/bin/bash 
result=`awk '/^T/ {print}' filename `
result=`awk '/^(Tom|Key)/ {print}' filename `
echo $result 
(3)混合模式,即既可以使用关系表达式又可以使用正则表达式进行混合。

例如:

#! /bin/bash 
result=`awk '/^T/ && $2 > 80  {print}' filename `  
echo $result 
(4)区间模式,通过条件匹配一段连续的问本行。

例如:

#! /bin/bash
#匹配/^Tom/与$2=90行之间的行 
result=`awk '/^Tom/,$2=90 {print}' filename `
echo $result 
(5)BEGIN模式

该模式是一种特殊的你内置模式,执行于awk程序还没有读取文本行之前,该模式仅仅被执行一次,当awk读取数据以后BEGIN不再成立。
例如:

#! /usr/bin/awk  -f
#输出字符串
BEGIN{ print "hello world!"}

又如:

#! /usr/bin/awk -f
#可以在开始执行awk前定义变量并进行一系列的初始化工作  
BEGIN{
    FS="[\t:]"
    RS="\n"
    count=30
    print RS  count
}
(6)END模式

该模式是一种特殊的你内置模式,执行于awk程序读取文本行并处理完以后,即将推出程序是执行,相当于做善后操作,该模式所对应的操作只执行一次。
例如:

#! /usr/bin/awk -f
#程序退出时显示提示信息 
END{
    print "code end"
}  
(六) awk提供的系统函数
  • index(str1,str2):返回str2在str1中的位置,如果有多个匹配,则返回第一个位置,否则返回0。
  • length(str) :字符串长度
  • split(str,arr,seperator):以seperator为分隔符把str分割存入数组arr中
  • match(str,regexp):在str中搜索符合正则表达式regex的子字符串。
  • sub(regexp,replace,str):将str中第一个符合正则表达式regexp的子字符串替换为replace。
  • gsub(regexp,replace,str):将str中全部符合正则表达式regexp的子字符串替换为replace。
  • substr(str,start,length):将字符串str中截取指定的子字符串。
  • 算术函数 想了解的自己查吧,这个太啰嗦。
(七) awk的流程控制
(1)判断
if(exp)
{
    statement
    ...
}
else
{
    statement
    ...
}  
(2)循环
for(i=0; i<n;i++)
{
statement
...
}

while( exp )
{
statement
...
}

do
{
statement
...
}while( exp );
(3)控制
  • break
  • continue
  • next 和cotinue不同,next并不用在循环结构中,而是用在整个awk中,当awk执行程序时,如果遇到next语句,则该语句中所有的程序语句都被忽略,awk则会读取下一行数据,并且从第一个模式及操作开始执行。

例如:

#! /usr/bin/awk -f
##当读取的行为空行时,跳过后面的语句
/^[\t]*$/{
    next
}
{
    print $1,$2,$3,$4
}
  • exit
(八) awk的格式化输出
(1)print
(2)priint(“format”,num);
(3)sprintf(“format”,num):sprintf()函数的功能与prntf()函数大致相同,但是该函数只是以字符串的形式返回格式化结果,并不输出到标准设备。可以使用该函数的返回结果使用print,printf()输出到标准设备上。
#! /usr/bin/awk -f 
BEGIN{
    print "begin"
    total=0
}
{
    printf("%s\t%d\t%d\t%d\t\n",$1,$2,$3,$4)
    total=total+$2+$3+$4
}
END{
    ##计算平均分
    ave=total/NR
    ##输出统计结果
    sum=sprintf("Total:%d stutents,ave:%0.2f",NR,ave);
    print sum
}
(九) awk与shell的交互使用
(1)通过管道实现与shell的交换

例如:

#! /usr/bin/awk -f  
BEGIN{
    #通过管道来执行who命令的执行结果
    while("who" | getline )
    {
        i++
    }
    printf("there are %d online  users",n)
}

上述例子中,通过管道来执行who命令,将执行结果传递给getline函数,该函数依次读取每一行数据

(2)通过system函数实现与shell的交互

例如:

#! /usr/bin/awk -f 
BEGIN{
    system("ls > filename")
    while( getline < "filename" > 0  )
    {
        print $1
    }
}

上述例子中,使用system函数执行ls命令,由于system 不支持函数的传递,所以必须将结果重定向到filename文件中,然后用getline函数重新读取出来。

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: awk是一种文本处理工具,常用于shell脚本中。它可以读取文本文件,对每一行进行处理,并输出结果。awk的基本语法为: awk 'pattern {action}' file 其中,pattern是一个正则表达式,用于匹配文本中的某些行;action是一个命令序列,用于对匹配到的行进行处理。awk会自动将每一行分割成若干个字段,可以通过$1、$2等变量来访问这些字段。例如,以下命令可以输出文件中第一列的内容: awk '{print $1}' file 除了基本语法外,awk还有很多高级用法,例如可以使用内置函数、变量、数组等。可以参考awk的官方文档或其他教程来学习更多内容。 ### 回答2: awk是一种文本处理工具,在shell脚本中经常用于对数据文件进行处理。它可以对文件进行逐行扫描,并按照指定的规则进行分割、匹配和处理。以下是awkshell脚本中的用法详解: 1. 基本语法 awk 'pattern { command }' filename 其中,pattern是匹配模式,用于匹配文件中的文本;command是要执行的命令,可以是一行或多行。filename是要处理的文件名。 2. 变量 在awk中有很多内置变量可以使用,例如: - $0:表示整行文本 - $1, $2, $3...:表示第一、二、三列文本 - NF:表示当前行的列数 - NR:表示当前行的行号 - FS:表示字段分隔符,默认为制表符或空格 可以使用这些变量来进行数据的处理和统计。 3. 示例 下面是一些常用的awk示例: (1)从文件中抽取出第一列 $ awk '{print $1}' file.txt (2)统计文件中每行的单词数 $ awk '{print NF}' file.txt (3)筛选出文件中包含关键词的行 $ awk '/keyword/' file.txt (4)计算文件中各列的和 $ awk '{sum += $1 + $2 + $3} END {print sum}' file.txt (5)替换文本中的字符串 $ awk '{gsub("oldstring", "newstring")}1' file.txt 4. 总结 awk是一种非常强大的文本处理工具,它能够根据指定的模式从文本中提取信息,并对其进行处理和统计。熟练掌握awk使用可以让我们更轻松地处理和分析大量文本数据。 ### 回答3: Shell脚本是编程语言之一,它可以利用awk命令来处理和分析文本数据。awk命令是Linux/Unix系统中经常使用的一个工具,可以对文本文件或标准输入数据进行扫描、过滤、处理和分析,从而很好地完成文本处理的任务。 在Shell脚本中,使用awk命令需要按照如下结构: ```bash awk 'commands' filename ``` 其中,`commands`是awk命令的参数,可以是简单的字符串或复杂的处理脚本。`filename`是需要处理和分析的文件名或者通过管道传输的标准输入数据。 awk命令的一些常用参数和语法如下: 1. `awk '{pattern + action}' filename`:在文件中搜索指定的模式或文本,并对匹配模式的行执行指定的操作。 2. `awk '{print $n}' filename`:将文件中的某列数据提取出来进行打印输出,$1表示第一列数据,$2表示第二列数据,以此类推。 3. `awk -F: '{print $1,$3}' filename`:指定文件的分隔符为“:”,然后提取文件的第一列和第三列数据。 4. `awk '{sum+=$1} END {print sum}' filename`:计算文件中的数据列的总和值,并进行输出。 5. `awk '/re/ {print $0}' filename`:搜索指定的正则表达式re,并将匹配的行输出。 6. `awk '{if($1="xxx") print $0}' filename`:对文件中的指定数据列进行筛选,符合条件就进行输出。 以上是awk命令的一些常用参数和语法,值得注意的是,awk命令非常强大,可以完成很多复杂的文本处理和数据分析,几乎可以操作所有的文本数据。所以,对于Shell脚本中的awk用法,需要根据具体的需求和场景进行灵活运用和学习。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值