[ 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. docker守护式容器运行管理

    docker守护式容器适合运行应用程序和服务 以交互方式进入容器  docker run -it centos /bin/bash 以交互方式进入 并设置镜像名称和运行后的主机名称 退出交互式容器并让 ...

  2. 转:使用 /proc 文件系统来访问 Linux 内核的内容

    使用 /proc 文件系统来访问 Linux 内核的内容 https://www.ibm.com/developerworks/cn/linux/l-proc.html /proc 文件系统并不是 G ...

  3. Spring MVC 接入 rabbitMQ

    依赖包 <dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spr ...

  4. LeetCode(37) Sudoku Solver

    题目 Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by ...

  5. Tomcat启动慢(运行shutdown.sh的时候报错)

    Using CATALINA_BASE: /usr/local/tomcatUsing CATALINA_HOME: /usr/local/tomcatUsing CATALINA_TMPDIR: / ...

  6. Python+selenium(多表单、多窗口切换)

    多表单切换 案例:在Frame.html文件种定位搜狗搜索页面,进行搜索操作 Frame.html <html> <head> <title>Frame_test& ...

  7. <转>C#中线程的学习

    原文发布时间为:2008-11-15 -- 来源于本人的百度文章 [由搬家工具导入] http://hi.baidu.com/cyap/blog/category/%B6%E0%CF%DF%B3%CC ...

  8. JS获取服务器时间并且计算距离当前指定时间差的函数

    项目中遇到了从服务器获取时间,现在记录一下方便以后查询: 1.后台代码:(创建一个date对象并以JSON的形式返回去) // 获取服务器时间 public String getNowServerTi ...

  9. C++内存分配方式(——选自:C++内存管理技术内幕)

    C++内存分配的区: 1.栈:程序运行时分配的,局部变量,以及传入的参数等存储的地方,在程序结束的时候会回收 2.堆:new分配,由delete释放 3.自由存储区:malloc分配 4.全局/静态存 ...

  10. 用 Gearman 分发 PHP 应用程序的工作负载【转载】

    通过本文,了解工作分发系统 Gearman 并分发用 PHP.C.Ruby 及其他受支持语言编写的应用程序的工作负载. 尽管一个 Web 应用程序的大部分内容都与表示有关,但它的价值与竞争优势却可能体 ...