[ awk简单介绍: ]

awk能够从一个文本中获取部分内容, 或者对这个文本进行排版, 使它按某种格式输出.

[ awk工作流程: ]

awk会把文件一行内容去到内存里, 然后对这行内容进行分段 ( 默认按空格或tab切割, $1, $2, $3... ). 再删了, 然后读取第二行内容到内存...
格式: awk '{/pattern/ command1; command2; ...}' file        # 匹配模式的这一行运行命令
比如: who | awk '{print $1}'    # 把分段的第一块内容打印出来, $1为第一段,  $0为一行全部内容

[ awk參数说明: ]

-F re:同意awk更改其字段分隔符。
-v  定义变量, 从shell给awk传递变量, 如-vDATE=$DATE, 即将shell中$DATE变量值传递给awk变量DATE。

-f progfile:同意awk调用并运行progfile程序文件,当然progfile必须是一个符合awk语法的程序文件。

[ awk内置变量: ]

ARGC  命令行參数的个数

ARGV  命令行參数数组

ARGIND  当前被处理文件的ARGV标志符
                awk '{if(ARGIND==1){print $1} if(ARGIND==2){print $2}}' aaa.txt bbb.txt  # 先扫描aaa文件, 再扫描bbb文件


NR  已经读出的记录数
       awk 'NR==1,NR==5{print}' aaa.txt  # 显示aaa.txt文件的 1 到 5 行


FNR  当前文件的记录数
         awk 'NR==FNR{print "a"} NR > FNR{print "b"}' a.txt b.txt 
         # 输入文件a.txt和b.txt, 因为先扫描a.txt, 所以扫描a.txt的时候必定有NR==FNR;
         # 然后扫描b.txt的时候, FNR从1開始计数, 而NR则接着a.txt的行数继续计数, 所以NR > FNR


FS  输入字段分隔符(缺省为:space:),相当于-F选项
       awk -F ':' '{print $1}' ccc.txt  # 输入文件以 : 作为切割符


OFS  输出字段分隔符(缺省为:space:)
           # 输出时以 ; 切割
          ① cat ccc.txt  例如以下:

               1:2:3

               4:5:6
          ② awk
-F ':' 'BEGIN{OFS=";"}{print $1,$2,$3}' ccc.txt

          ③ 输出结果例如以下: 

               1;2;3

               4;5;6

NF  当前记录中的分段个数
       awk -F ':' '{print NF}' ccc.txt 


RS  输入记录分隔符, 缺省为"\n", 缺省情况下, awk把一行看作一个记录; 假设设置了RS, 那么awk依照RS来切割记录
       ① cat ccc.txt:       hello world; I want to go swimming tomorrow;hiahia

       ② 执行 awk 'BEGIN{ RS = ";" } {print}' ccc.txt 

       ③ 结果例如以下:
            hello world

            I want to go swimming tomorrow

            hiahia


ORS  输出记录分隔符,缺省为换行符。控制每一个print语句后的输出符号

awk 'BEGIN{ FS="\n"; RS=""; ORS=";"} {print NF}' ddd.txt


[ awk内置函数: ]

blength[([s])]                计算字符串长度(byte为单位)

length[([s])]                  计算字符串长度(character为单位)

rand()                            生成随机数

srand([expr])                设置rand() seed

int(x)                             字符串转换为整型

substr(s, m [, n])           取子字符串

index(s, t)                     在字符串s中定位t字符串首次出现的位置

match(s, ere)                在字符串s中匹配正则ere,match改动RSTART、RLENGTH变量。

split(s, a[, fs])              将字符串切割到数组中

sub(ere, repl [, in])       字符串替换

gsub                              同上

sprintf(fmt, expr, ...)   拼字符串

system(cmd)                在shell中运行cmd。

toupper(s)                    字符串转换为大写

tolower(s)                    字符串转换为小写

[ awk使用方法演示样例: ]

1.  -F 表示以什么作为分隔符
   awk -F: '{print $1}' ccc.txt                     # 以 : 作为分隔符, 打印出ccc.txt文件里每一行中的第一段字符串
   awk -F: '{print $1,$2}' ccc.txt               #
打印第一段和第二段字符串, 假设这样写$1 $2 那么打印的内容会连在一起

2. /pattern/ 模式匹配
   awk -F: '/A/{print $1}' ccc.txt               # 以 : 作为分隔符, 打印出ccc.txt文件里含有 A 的第一段字符串

3. ^ 表示以什么开头

   awk -F: '/^A/{print $1}' ccc.txt             # 以 : 作为分隔符, 打印出ccc.txt文件里以 A
开头的第一段字符串

4. ~ 表示匹配的意思

   awk -F: '$4 ~ /A/{print $1}' ccc.txt      # 以 : 作为分隔符,
打印出ccc.txt文件里第四段中含有 A 的字符串

5. awk在把第一行读入内存之前, 能够先做其它的一些操作, 使用BEGIN
   格式: awk 'BEGIN{command} /pattern/ {command1; command2; ...}' file

   awk 'BEGIN{FS=":"}$1 ~ /A/{print $1}' ccc.txt   # 读取ccc.txt文件之前, 首先运行BEGIN里的命令, 设置 : 作为切割符
   awk 'BEGIN{FS=":"; OFS="-"}$1 ~ /A/{print $1,$2}' ccc.txt #
输出的分隔符以 - 进行隔开

6. awk在全部行处理完之后, 还能够先一些操作, 使用END
   格式: awk 'BEGIN{command} /pattern/ {command1; command2; ...} END{command}' file

7. 统计每一行分段后的段数用NF
   who | awk '{print NF}' 

8. 获取awk处理文件内容在源文件里是第几行用NR
   awk -F: '/^A/{print NR}' ccc.txt          # 获取以 A 开头的串在ccc.txt是第几行

9. 自己定义变量
   awk 'BEGIN{a=0}/tb/{a++} END{print a}' ccc.txt
   # 循环ccc.txt文件之前, 先定义一个变量, 初始值为0; 然后循环每一行, 每找到一行含有tb的行就给 a 加 1, 直到最后打印 a 的值.


linux-shell脚本命令之awk的更多相关文章

  1. linux shell脚本命令

    sort命令 sort #按照字典序排序 sort -n #以数值来排序,避免10比2小的情况 sort -k #如果文件有多列,指定排序的列 sort -r #逆序排列 uniq 命令 sort t ...

  2. linux 基础 shell脚本命令

    #########shell脚本命令#### 1.diff diff file file1 ####比较两个文件的不同 -c ####显示周围的行 -u ####按照一格式统一输出生成补丁 -r ## ...

  3. linux shell 脚本攻略学习20--awk命令入门详解

    awk生于1977年,创始人有三个,分别为 Alfred Aho,Peter Weinberger, 和 Brian Kernighan,名称源于三个创始人的姓的首字母. 作用:处理文本文件. awk ...

  4. Linux Shell脚本入门--cut命令

    Linux Shell脚本入门--cut命令 cut cut 命令可以从一个文本文件或者文本流中提取文本列. cut语法 [root@www ~]# cut -d'分隔字符' -f fields &l ...

  5. Linux Shell脚本入门--wget 命令用法详解

    Linux Shell脚本入门--wget 命令用法详解 wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括Windows在内的各个平台上.它有以下功能 ...

  6. Linux Shell 脚本入门

    linux shell 脚本格式 #!/bin/sh#..... (注释)命令...命令... 使用vi 创建完成之后需设置权限 chmod +x filename.sh 执行命令: ./filena ...

  7. Linux Shell脚本教程

    v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...

  8. Linux Shell脚本攻略

    -Linux Shell脚本攻略 总结的来说,这本书很实践性和实用性强,都是给的具体的例子,直接可以在终端操作实践,比单纯只看不动手务实多了,另外就是,这本书涵盖的内容也比较广,从文本操作到服务器管理 ...

  9. 老李分享:《Linux Shell脚本攻略》 要点(八)

    老李分享:<Linux Shell脚本攻略> 要点(八)   1.打印进程 [root@localhost program_test]# ps -e | head  PID TTY     ...

  10. 老李分享:《Linux Shell脚本攻略》 要点(七)

    老李分享:<Linux Shell脚本攻略> 要点(七)   1.显示给定文件夹下的文件的磁盘适用情况 [root@localhost program_test]# du -a -h ./ ...

随机推荐

  1. C语言之static用法

    1,static修饰全局变量 限定变量的作用域.被static修饰的全局变量存储域不变,依然存储在静态存储区,即bss段或data段.但作用域发生改变,被static修饰全局变量只能被本文件的函数访问 ...

  2. 【HIHOCODER 1605】小Hi的生成树计数

    描述 小Hi最近对生成树(包含所有顶点的联通无环子图.)非常的感兴趣,他想知道对于特定的简单平面无向图是不是存在求生成树个数的简单方法. 小Hi定义了这样的图:一个以{0,1,2--n}为顶点的图,顶 ...

  3. include_once 问题

    最近在做微信小程序,在include_once 微信文件后,该方法return 前面会用特殊字符,导致我return 给前端的本来是json串变成了字符 解决方法 : ob_clean(); retu ...

  4. 3D地形中的道路模拟

    笔者注: 这篇文章是我本人在2009年发表在cppblog的一篇技术文章,由于我的技术博客迁移至博客园,所以转载到了此,非盗文. 以下是正文: 前段时间被项目组长委派实现基于3D地形的道路系统.实现的 ...

  5. 【06】sass编译工具(弃)

    [06]编译工具(弃) SASS转译工具 除了使用sass命令来转译SASS文件之外,还可以借助第三方工具完成,目前世面上较为流行的转译工具主要有: Compass.app Scout Codekit ...

  6. SPOJ GNYR09F 数字上的找规律DP

    Problem C      SPOJ GNYR09F dp题,dp可能刚刚开始对大家来说比较难,但是静下心来分析还是比较简单的: dp(i ,j ,k)表示前i个数中,当前累积和为j,末尾数字为k的 ...

  7. [HDU2157]How many ways??(DP + 矩阵优化)

    传送门 k < 20 k这么小,随便dp一下就好了... dp[i][j][k]表示从i到j经过k个点的方案数 4重循环.. 但是如果k很大就不好弄了 把给定的图转为邻接矩阵,即A(i,j)=1 ...

  8. jvm参数设置 -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M

    -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M 这里有几个问题: 1. 各个参数的含义什么? 2. 为什么有的机器我将- ...

  9. 【NOIP模拟】数字对(RMQ,二分)

    题意:小H是个善于思考的学生,现在她又在思考一个有关序列的问题. 她的面前浮现出一个长度为n的序列{ai},她想找出一段区间[L, R](1 <= L <= R <= n). 这个特 ...

  10. 安装redis和phpredis模块

    安装redis shell> wget http://redis.googlecode.com/files/redis-2.0.4.tar.gz shell> tar zxvf redis ...