[ 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. [模板] Miller-Rabin 素数测试

    细节挺多的.. #include<iostream> #include<cstdlib> #include<cstdio> #include<ctime> ...

  2. 常见的User-Agent

    User_Agent = ["Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_2 like Mac OS X; zh-cn) AppleWebKit/533. ...

  3. 24. TABLES

    24. TABLES TABLES表提供有关数据库中表的信息. TABLES表有以下列: TABLE_CATALOG :表所属目录的名称.该值始终为def. TABLE_SCHEMA :表所属sche ...

  4. 由Java实现Valid Parentheses

    一.题目 Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the ...

  5. C#中如何使用正则表达式

    [草稿版本,谨慎阅读] 参考文档:正则表达式30分钟入门教程 如需系统学习正则表达式内容,请移步上述教程. 正则表达式按照指定的规则来匹配字符或字符串.'.' ' \b' ' \d'等等被称为是正则表 ...

  6. CSS小知识点一

    1.   text-indent属性    缩进文本 通过使用 text-indent 属性,所有元素的第一行都可以缩进一个给定的长度,甚至该长度可以是负值.这个属性最常见的用途是将段落的首行缩进,一 ...

  7. AI学习笔记(01)

    [1]在Ai中,每个对象有两个属性:填充颜色和描边颜色.   [2]在AI中,非要选中,才操作.而PS中,选中图层即可.   [3]AI中,都是路径.   [4]选择工具是选中整个路径,而直接选择工具 ...

  8. Python+selenium常用方法(Webdriver API)

    小编整理了目前学习的Python+selenium常用的一些方法函数,以后有新增再随时更新. 加载浏览器驱动: webdriver.Firefox() 打开页面:get() 关闭浏览器:quit() ...

  9. Java高级程序员面试题

    1.你认为项目中最重要的过程是那些? 分析.设计阶段  尽量找出进度的优先级 2.如果给你一个4-6人的team,怎么分配? 挑选一技术过硬的人作为我的替补.其它人平均分配任务,每周进行全面的任务分配 ...

  10. Ubuntu 16.04安装JDK7/JDK8的两种方式

    ubuntu 安装jdk 的两种方式:1:通过ppa(源) 方式安装. 2:通过官网下载安装包安装. 这里推荐第1种,因为可以通过 apt-get upgrade 方式方便获得jdk的升级 使用ppa ...