`
weiyinchao88
  • 浏览: 1234371 次
文章分类
社区版块
存档分类
最新评论

Shell编程笔记(高级1)-深入讨论awk和<<

 
阅读更多

作者: sunwill_chen 发表日期: 2007-01-31 15:34 文章属性: 原创 复制链接


一.深入讨论awk
1.awk不仅是一个工具,它是一种语言。其涉及的条件操作符有:
<,<=,>,>=,==,!=,!~(不匹配正则表达式), ~ (匹配正则表达式)
2. 逻辑操作符有:&& (and), || (or), ! (not)
3.awk的内置变量
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览的文件名
FS 设置输入域分隔符,等价于命令行-F选项
NF 浏览记录的域个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符
awk -F '#' '{print NF,NR,$0,ARGV[1],ENVIRON["USER"]}' test.txt 以域为分隔符,打印域的个数,已读的记录数,整行信息,第一个参数(0的话是awk)及用户(最后一个是取得系统的环境变量)
4.awk的字符串函数
gsub(r,s) 在整个$0中用s替代r
gsub(r,s,t) 在整个t中用s替代r
index(s,t) 返回s中字符串t的第一个位置
length(s) 返回s的长度
match(s,r) 测试s是否包含匹配的r的字符串
split(s,a,fs) 用fs(分割符)将s分成序列a
sprint(fmt,exp) 返回fmt格式化后的exp
sub(r,s) 用$0中最左边最长的字串代替s
substr(s,p) 返回字符串s中从p开始的部分
substr(s,p,n) 返回字符串s中从p开始长度为n的部分
example: awk -F '#' '{if (gsub("s","S",$1)) print $1}' test.txt 以#为分割符,用"S"代替test.txt中每行第一个域中的"s",并打印第一个域
awk -F '#' '{print (index($1,"s"))}' text.txt 打印“s”在每一行第一个域中的位置,若为0表示没有这个字符
5.awk中的转义字符
/b 退格键
/t tab键
/f 走纸换页
/ddd 八进制值
/n 新行
/c 任意其他特殊字符,如//为反斜杠符号
/r 回车键
example: awk -F '#' '{print (index($2,'s')), "/t",$2}' test.txt 打印"s"在第二个域中的位置、退格(相当于键入tab键)、第二个域的内容
6.printf修饰符
%c ASCII字符
%d 整数
%f 浮点数
%e 浮点数,科学记数法
%g awk决定使用哪种浮点数转换,e或者f
%o 八进制数
%s 字符串
%x 十六进制数
example: awk -F '#' '{printf "%c/n",$1}' test.txt 打印test.txt文件中的第一个域的ASCII码 (注意"%c/n"与"$1"之间的"," 是不可以忽略的)
7.awk数组
awk中数组叫做关联数组(associative arrays),因为下标记可以是数也
可以是串。awk中的数组不必提前声明,也不必声明大小。数组元素用0或
空串来初始化,这根据上下文而定。
awk 'BEGIN {print split("as#qw#1234",array2,"#")}' 表示以"#"为分割符,将"as#qw#1234"分割到array2数组中,并打印数组的长度
awk 'BEGIN {split("as#qw#1234",array2,"#"); print array[1]}' 如上,并打印该数组的第一个元素。(注意:这里的是数组是从下标1开始的)
8.举例分析:
(1) awk '{if ($1~/^21[0-9]/) print $0}' test.txt |wc -l 匹配test.txt中第一个域为210-219开头的行,并通过管道计算其数量。
(2)awk '{if ($4~/^/[07//Jul//2004/) print $0 }' test.txt | awk '{if ($7=="/htm/free_call.php") print $0} ' |wc -l 匹配test.txt中第四个域以 "[07/Jul/2004" 开头的且第7个域为"/htm/free_call.php"的所有行,并计算其数量。该语句本来的意思是:统计2004年7月24日访问 /htm/free_call.php的次数。
(3)以下是awk_array.sh的文件内容
#!/bin/awk -f #注明是awk的语法,若无此行则按bash的语法编译会出错
#awk_array.sh
BEGIN{ #BEGIN模式中的命令
FS="#"
score["0-60"]=0 #score数组索引为"0-60"的元素(awk语法允许用字符串索引)
score["60-70"]=0
score["70-80"]=0
score["80-90"]=0
score["90-100"]=0
student["junior"]=0
student["senior"]=0
}
{
{ if ($1<60) #如果第一个域的值小于60
score["0-60"]++ #score数组中索引为"0-60"的元素值+1
}
{ if($1>=60 && $1<70)
score["60-70"]++
}
{ if($1>=70 && $1<80)
score["70-80"]++
}
{ if($1>=80 && $1<90)
score["80-90"]++
}
{ if($1>=90&&$1<=100)
score["90-100"]++
}
}
{ #另senior_junior依次为student数组中的索引(有几个就循环几次)
for (senior_junior in student)
{if ($2==senior_junior)
student[senior_junior]++
}
}
END{
{ for (number in score) print "the score",number,"has",score[number],"students"}
{ for (senior_junior in student) print "The class has ",student[senior_junior],senior_junior,"students" }
}
若有文件grade.txt如下:
85#senior
87#junior
78#junior
69#senior
56#junior
98#senior
83#senior
输入命令./awk.sh grade.txt 则输出如下:
the score 0-60 has 1 students
the score 70-80 has 1 students
the score 90-100 has 1 students
the score 60-70 has 1 students
the score 80-90 has 3 students
The class has 4 senior students
The class has 3 junior students

二..深入讨论<< (标准输入)
举例来说明:
#!/bin/bash
#input.sh
cat<<hello #打印此处开始到hello结束之间的所有字符
***************************
This is a test!
***************************
hello #标准输入到此行之前结束(注意:这个hello必须在句首,其前面不能有任何字符,甚至是空格)
则输出: ****************************
This is a test!
****************************
______________________________________________________________________________
分享到:
评论

相关推荐

    shell编程教程.chm

    shell编程-shell编程-分支语句(1) shell编程-shell编程-分支语句(2) shell编程-shell编程-循环语句(1) shell编程-shell编程-循环语句(2) Linux的shell编程(一) Linux的shell编程(二) Linux的...

    《LINUX与UNIX SHELL编程指南》读书笔记-二次发布版

    本文将基于《LINUX与UNIX SHELL编程指南》这本书的读书笔记,深入探讨Linux与Unix Shell编程的核心知识点。 一、Shell概述 Shell是一个命令解释器,它接收用户输入的命令并执行。在Linux和Unix系统中,常见的Shell...

    unix编程之Unix Shell学习笔记

    ### Unix Shell 编程知识点概览 #### 一、Unix Shell 概述 ...通过以上知识点的学习,读者可以更好地理解和掌握 Unix Shell 编程的基本概念和技术细节,为深入学习 Unix Shell 脚本编程打下坚实的基础。

    《LINUX与UNIX SHELL编程指南》读书笔记

    在深入探讨《LINUX与UNIX SHELL编程指南》的读书笔记之前,让我们先理解什么是Linux和Unix Shell编程。Linux和Unix是两种广泛使用的类UNIX操作系统,它们提供了命令行界面(CLI),用户通过输入命令来执行任务。...

    linux与unix shell编程指南

    通过阅读这本书和相关的读书笔记,读者不仅可以学习到基本的shell编程知识,还能深入理解Linux和Unix系统的工作原理,从而更好地管理和自动化日常工作。这本书对于系统管理员、开发者以及所有希望提高Linux终端技能...

    shell编程

    1. **笔记.zip**:这可能包含作者编写的关于shell编程的笔记,涵盖了基础概念、语法、实例和技巧。 2. **资料.zip**:可能包含更详细的文档、教程或示例,帮助读者深入理解shell编程的各个方面。 3. **.idea.zip**:...

    Linux_shell编程学习笔记

    Linux Shell编程是Linux系统管理与自动化任务中的重要一环,主要通过编写脚本来实现对操作系统进行交互和控制。本文将详细解析Linux Shell编程中的几个关键概念:正则表达式、find命令、grep命令以及sed命令。 1. *...

    《LINUX与UNIX SHELL编程指南》

    《LINUX与UNIX SHELL编程指南》是一本深入讲解Linux和UNIX Shell编程的书籍,适合对操作系统有浓厚兴趣,特别是热衷于Linux环境下的命令行交互和自动化脚本编程的爱好者阅读。本书全面覆盖了Shell的基础知识、高级...

    《LINUX与UNIX SHELL编程指南》读书笔记.pdf

    《LINUX与UNIX SHELL编程指南》这本书深入浅出地介绍了如何利用Shell进行高效编程,帮助读者提升在Linux和Unix环境下的工作效率。下面,我们将探讨一些核心的知识点: 1. **Shell脚本基础**:Shell脚本是通过Shell...

    Shell 学习笔记 word ppt

    Shell学习笔记主要涵盖的是在Unix/Linux环境中使用Shell脚本来进行自动化任务处理和系统管理的知识。Shell作为操作系统与用户交互的接口,提供了强大的命令行工具和脚本编程能力,是IT行业中不可或缺的基础技能之一...

    Shell学习笔记总结

    本资源是 Shell 学习笔记的总结,涵盖了 Shell 的基本概念、类型、变量、进程、权限、管道、POSIX、grep、sed、awk 等命令和编程语言。 一、 Shell 的类型和特点 Shell 是一种命令行界面,提供了访问操作系统的...

    Unix&Linux shell编程指南

    在"Shell编程指南.pdf"中,可能详细讲解了Shell函数、数组、输入输出重定向、管道(|)和重定向(&gt;,&lt;)等高级特性。输入输出重定向允许将命令的标准输出重定向到文件,或者从文件读取标准输入。管道则能连接多个...

    Awk学习笔记和指南

    awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其它命令的输出。它支持用户自定义函数和 动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。...

    根据《Shell脚本编程详解》第12章节-Shell脚本编程,自己写的shell脚本。

    这个压缩包中的"Shell脚本编程详解"很可能是书籍的电子版或笔记,包含了更深入的理论和实例。对于初学者,建议从理解基础语法开始,逐步练习编写简单的脚本,然后逐步挑战更复杂的任务,加深对Shell脚本的理解和应用...

    《UnixShell实例精解》-学习笔记.doc

    Unix Shell 实例精解学习笔记 本文档主要介绍 Unix ... Unix Shell 实例精解学习笔记,涵盖了 Unix Shell 的基础知识、正则表达式的基础知识和应用等内容,为学习 Unix Shell 和正则表达式提供了有价值的参考资料。

    awk学习使用笔记及举例

    ### awk学习使用笔记及举例 #### 1. awk简介 awk是一种专为文本处理...以上是对awk学习使用笔记的一个概述,包含了从基本概念到高级技巧的内容。通过理解和掌握这些知识点,可以有效地利用awk进行文本处理和数据分析。

Global site tag (gtag.js) - Google Analytics