摘自:http://bbs.51cto.com/thread-883948-1-1.html

awk(流程控制、内置变量、内置函数、数组) ...

参考其他的资料,给大家看看。一、awk流程控制语句

1、awk条件判断语句(if)
if格式:
if(表达式)
{语句1}
else if(表达式)
{语句2}
else
{语句3}
#awk 'BEGIN{
> test=100; 
> if(test>90){print "very good"}   
> else if(test>60){print "good"}
> else{print "no pass"}    
> }'
very good
2、awk循环语句(while,for,do)
while格式:
while(表达式)
{语句}
#awk 'BEGIN{
> test=100;
> total=0;
> while(i<=test) 
> {           
>  total+=i;
>  i++;
> }
> print total;
> }'
5050
for格式1:
for(变量 in 数组)
{语句}
#awk 'BEGIN{
> for(k in ENVIRON)
> {
>  print k"="ENVIRON[k];
> }
> }'
TERM=linux
G_BROKEN_FILENAMES=1
SHLVL=1
EDITOR=vim
PWD=/root
TMOUT=6000
HISTTIMEFORMAT=%F %T -- 
...........
for格式2:
for(变量;条件;表达式)
{语句}
#awk 'BEGIN{
total=0;
for(i=0;i<=100;i++)
{
total+=i;
}
print total;
}'
5050

do循环
格式:
do
{语句}while(条件)
#awk 'BEGIN{
> total=0;
> i=0;
> do
> {
>  total+=i;
>  i++;
> }
> while(i<=100)
> print total;
> }'
5050

********************************************************************************
内置变量1:
$0  当前记录(作为单个变量) 
$1~$n   当前记录的第n个字段,字段间由FS分隔 
FS 输入字段分隔符 默认是空格 
NF  当前记录中的字段个数,就是有多少列 
NR  已经读出的记录数,就是行号,从1开始 
#awk '/^root/{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
#awk 'BEGIN{FS=":"}/^root/{print $1,$NF}' /etc/passwd
root /bin/bash
(NF表示多少列嘛,那么$NF就表示最后一列)
#awk 'BEGIN{FS=":"}{print NR,$1,$NF}' /etc/passwd
1 root /bin/bash
2 lp /sbin/nologin
3 sync /bin/sync
4 shutdown /sbin/shutdown
5 halt /sbin/halt
6 operator /sbin/nologin
7 gopher /sbin/nologin
8 nobody /sbin/nologin
........
可以看出NR排好了行,相当于vim进去后set number的效果。

内置变量2:
ORS 输出的记录分隔符,默认为换行符 
OFS 输出字段分隔符 默认也是空格 
ARGC  命令行参数个数 
ARGV  命令行参数数组 
#awk 'BEGIN{FS=":";ORS="**"}{print FNR,$1,$NF}' /etc/passwd
1 root /bin/bash**2 lp /sbin/nologin**3 sync /bin/sync**4 shutdown /sbin/shutdown**5 halt /sbin/halt**6 operator /sbin/nologin**7 gopher /sbin/nologin**8 nobody /sbin/nologin
可以看到原本换行符的形式通过ORS使得输出的换行符形式改成了**
#awk 'BEGIN{FS=":";print "ARGC="ARGC;for(k in ARGV) {print k"="ARGV[k]; }}' /etc/passwd
ARGC=2
0=awk
1=/etc/passwd
ARGC得到所有输入参数个数,ARGV获得输入参数内容,是一个数组。
感觉这个不太实用!

********************************************************************************
awk内置函数:算数函数、字符串函数、其它一般函数

一、算数函数
cos( x ) 返回 x 的余弦;x 是弧度。 
sin( x ) 返回 x 的正弦;x 是弧度。 
int( x ) 返回 x 的截断至整数的值。 
#awk 'BEGIN{a=int(8.998273485);print a}'
8
二、字符串函数
sub( Ere, Repl, [ In ] )  
gsub( Ere, Repl, [ In ] ) 
index( String1, String2 ) 
match( String, Ere )
substr( String, M, [ N ] )
split( String, A, [Ere] )
length [(String)]

#awk 'BEGIN{info="this is a test123test456!";sub(/[0-9]+/,"!",info);print info}'
this is a test!test456!
用sub实现替换,注意sub括号内的格式
[Intranet [email=root@inc-wzp24-oldxen-150-117]root@inc-wzp24-oldxen-150-117[/email] /etc/xen]
#awk 'BEGIN{info="this is a test123test456!";gsub(/[0-9]+/,"!",info);print info}'
this is a test!test!!
用gsub实现全局替换

#awk 'BEGIN{info="this is a test123test!!";print index(info,"test")?"test exist!":"no found test!"}'  
test exist!
#awk 'BEGIN{info="this is a test123test!!";print index(info,"321")?"321 exist!":"no found 321!"}'            
no found 321!
通过index查找字符串

#awk 'BEGIN{info="this is a test123test!";print match(info,/[0-9]+/)?"num exist":"no found num!"}'     
num exist
#awk 'BEGIN{info="this is a testtest!";print match(info,/[0-9]+/)?"num exist":"no found num!"}'   
no found num!
通过match实现正则表达式匹配查找

#awk 'BEGIN{info="1234567abc";print substr(info,4,6)}' 
4567ab
通过substr截取字符串,从第2个字符开始,截取6个长度的字符串
#awk 'BEGIN{info="this is a test";split(info,a," ");for(i in a);print i,a}'      
3 a
#awk 'BEGIN{info="this is a test haha";split(info,ali," ");print length(ali);for(k in ali){print k,ali[k]}}'      
5
4 test
5 haha
1 this
2 is
3 a
通过split实现字符串分割

三、一般函数
getline[ Variable ]
system(Command)
#awk 'BEGIN{print "input your name:";getline name;print name}'
input your name:
alibaba
alibaba
通过getline来获取用户输入数据,相当于shell的read命令

#awk 'BEGIN{b=system("date;cal");print b}' 
Wed Sep  7 15:53:48 CST 2011
   September 2011   
Su Mo Tu We Th Fr Sa
             1  2  3
4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30
0
system用户调用外部应用程序命令,还可以发现返回了运行状态码0

********************************************************************************
一、定义数组方法
1、可以用数值作为数组索引
a[1]="hello world"
b[2]="hello baby"
2、可以用字符串作为数组索引
a["first"]="alibaba"
b["last"]="taobao"

二、数组相关函数
1、获取数组长度(length方法使用)
#awk 'BEGIN{info="this is a test";len=split(info,a," ");print length(a),length(info),len}' 
4 14 4
2、输出数组内容(无序,有序输出):

#awk 'BEGIN{info="this is a test";split(info,a," ");for(i in a){print i,a}}'  
4 test
1 this
2 is
3 a
#awk 'BEGIN{info="this is a test";len=split(info,a," ");for(i=1;i<=len;i++){print i,a}}'
1 this
2 is
3 a
4 test
#awk 'BEGIN{a[1]="b";c["d"]="f";if(a[1]="b"){print "good"};if(c["d"]!=g){print "good again"}}'
good
good again
3、数组排序实现方法
#awk 'BEGIN{
> a[100]=100;
> a[2]=224;
> a[3]=45;
> slen=asort(a,b)
> for(i=1;i<=slen;i++)
> {print i,b}
> }'
1 45
2 100
3 224
asort对数组的值进行排序,而原先键值丢掉。
#awk 'BEGIN{
> a["f"]=100;
> a["a"]=893;
> a["b"]=90;
> slen=asorti(a,b);
> for(i=1;i<=slen;i++)
> {print i,b,a[b]}
> }'
1 a 893
2 b 90
3 f 100
asorti对键值进行排序(字符串类型),将生成新的数组放入b中。

awk(流程控制、内置变量、内置函数、数组)的更多相关文章

  1. Shell基础(六):使用awk提取文本、awk处理条件、awk综合脚本应用、awk流程控制、awk扩展应用

    一.使用awk提取文本 目标: 本案例要求使用awk工具完成下列过滤任务: 1> 练习awk工具的基本用法    2> 提取本机的IP地址.根分区使用率    3> 格式化输出/et ...

  2. C# 篇基础知识2——运算符、类型转换、流程控制、枚举、结构体和数组、函数

    1.运算符.类型转换 计算某年y某月m某日d是周几的基姆拉尔森公式公式:int week = (d + 2*m + 3*(m + 1)/5 + y + y/4 - y/100 + y/400 + 1) ...

  3. JavaScript基本知识----操作符,流程控制,循环,字符串方法,数组方式,补充方法

    操作符 算术运算 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  4. awk流程控制

    awk 中if和for while 一.awk嵌套if判断语句 格式如下: if(表达式) {语句1} else if(表达式) {语句2} else {语句3} 如果if后边的语句块是的单个语句,{ ...

  5. nginx内置变量 大全

    nginx内置变量 内置变量存放在  ngx_http_core_module 模块中,变量的命名方式和apache 服务器变量是一致的.总而言之,这些变量代表着客户端请求头的内容,例如$http_u ...

  6. (转)最新版 nginx内置变量 大全

    原文:http://www.cnphp.info/nginx-embedded-variables-lasted-version.html 在配置基于nginx服务器的网站时,必然会用到 nginx内 ...

  7. java_day03_流程控制

    ch03 目标:表达式和流程控制 ---------------------------------------------- 1.实例变量和局部变量 程序的基本功能是处理数据,程序中需要使用变量来接 ...

  8. Scala深入浅出实战经典-----002Scala函数定义、流程控制、异常处理入门实战

    002-Scala函数定义.流程控制.异常处理入门实战 Scala函数定义 语句结束无分号 定义无参函数 def 函数名称(参数名称:参数类型)[:Unit=]{ 函数体 } 老师的代码 我的实际代码 ...

  9. JS——变量提升和函数提升

    一.引入 在了解这个知识点之前,我们先来看看下面的代码,控制台都会输出什么 var foo = 1; function bar() { if (!foo) { var foo = 10; } aler ...

随机推荐

  1. shell 脚本文件十六进制转化为ascii码代码

    十六进制的A转化为十进制ASCII码: 1 printf "%d\n" "'A" 十六进制的A转化为十六进制ASCII码: 1 printf "%x\ ...

  2. Linux系统编程(1)——文件与I/O之C标准I/O函数与系统调用I/O

    Linux系统的I/O也就是一般所说的低级I/O--操作系统提供的基本IO服务,与os绑定,特定于Linux平台.而标准I/O是ANSI C建立的一个标准I/O模型,是一个标准函数包和stdio.h头 ...

  3. 【转】morgan stanley 电面面经新鲜出炉

    楼楼早上上午大概11点接到的电话,一个声音炒鸡好听的GG,说他是来自morgan stanley的,想和我约一下店面时间.我一听,真是戳不及防,掐指一算,online的IKE测试已经过去20几天了吧, ...

  4. Ajax 缓存问题

    Ajax通过GET方式请求服务器数据,Microsoft Internet Explorer浏览器下,由于缓存问题,读取的数据非最新数据,解决问题方法如下: function getData(url, ...

  5. tr转换或删除字符

    字符处理命令:tr —— 转换或删除字符 逐个字符处理而不是处理单词的tr [OPTION]... SET1 [SET2]    -d: 删除出现在字符集中的所有字符 tr ab AB

  6. PHP Database ODBC 之 ODBC

    ODBC 是一种应用程序编程接口(Application Programming Interface,API),使我们有能力连接到某个数据源(比如一个 MS Access 数据库). 创建 ODBC ...

  7. js的for in循环和java里的foreach循环的差别

    js里的for in循环定义例如以下: for(var variable in obj) { ... } obj能够是一个普通的js对象或者一个数组.假设obj是js对象,那么variable在遍历中 ...

  8. Velocity.js发布:更快的动画切换速度

    Velocity.js是一款动画切换的jQuery插件,它重新实现了jQuery的$.animate()方法从而加快动画切换的速度.Velocity.js只有7k的大小,它不仅包含了$.animate ...

  9. iOS 将系统文字设置为中文

    在.info文件中添加  Localization native development region 键值 string   Value值:en

  10. MVC中的错误过滤器无法拦截URL路径错误的解决办法

    “/”应用程序中的服务器错误. 无法找到资源. 说明: HTTP 404.您正在查找的资源(或者它的一个依赖项)可能已被移除,或其名称已更改,或暂时不可用.请检查以下 URL 并确保其拼写正确. 请求 ...