[ 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. Gameia

    F - Gameia HDU - 6105   Alice and Bob are playing a game called 'Gameia ? Gameia !'. The game goes l ...

  2. Oracle中exit,return,continue

    记录exit和return的用法 exit用来跳出循环 loop IF V_KBP IS NULL THEN           EXIT;    END IF; end loop; return跳出 ...

  3. angular2 启动步骤

    以下内容转自网络 1. 创建项目文件夹 创建一个新的文件夹来保存你的项目,比如一开始有个self就好了 2.安装基础库 首先确保已经安装了node.js 我们使用 npm package manage ...

  4. 如何解决安装istio后istioctl命令每次使用都需要重新配置路径

    Kubernetes在安装istio后初次使用istioctl命令时会提示istioctl command not found 这时候如果在istio文件夹的根目录下配置 export PATH=$P ...

  5. uva12558 Egyptian Fractions (HARD version)(迭代深搜)

    Egyptian Fractions (HARD version) 题解:迭代深搜模板题,因为最小个数,以此为乐观估价函数来迭代深搜,就可以了. #include<cstdio> #inc ...

  6. CodeForces - 743B Chloe and the sequence

    暴力肯定是无法做的 当时做的时候 当成一道递推来做的 用到分治的思想 想象一串长度为2n+1的列 那么前n个为前一串数 后n个是前一串数的reverse 第n+1个数 为第几串的编号 例如 第几串 中 ...

  7. hihoCoder #1014 : Trie树 [ Trie ]

    传送门 #1014 : Trie树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互 ...

  8. type和metaclass元类

    元类type 1. 创建类的两种方式 (都是由type元类创建) 方式一: class Foo(object): # 默认metaclass = type, 当前类, 由type类创建 a = 'aa ...

  9. poj3905 2sat!

    这次已经不是2sat的问题了,相信2sat已经不是问题了,最后一题2sat,竟然跪在输入上! 千万注意scanf(%c)!读入!!!!有空格也读啊!!!读入+ -一定要用字符读啊??笨死算了!被人水死 ...

  10. 洛谷—— P1656 炸铁路

    P1656 炸铁路 题目描述 因为某国被某红色政权残酷的高压暴力统治.美国派出将军uim,对该国进行战略性措施,以解救涂炭的生灵. 该国有n个城市,这些城市以铁路相连.任意两个城市都可以通过铁路直接或 ...