二:awk--将一行分为数个字段处理

PS:awk [option] '条件类型 {动作1} 条件类型{动作2} ...' filename

PS: awk ‘Pattern {action}’ filename

option 条件类型Pattern 动作
-F: 默认为空格
awk -F ':' '{print $3}' passwd
正则表达式或逻辑判断式 内置函数:print(),printf(),getline..
控制指令:if(){...}else{...};while(){...}等等

awk工作原理:

1:awk读取一条记录作为(文件中的一行)作为输入,并将这条记录赋值给内部变量$0
2:记录被分隔为多个字段,每一个字段都被存储到指定编号的变量中,从$1开始
3:对于每一条记录,按照给定的Pattern匹配,匹配成功则执行对应的Action,如匹配失败,则不执行Action
#Pattern和Action必须提供其中的一个,如果Action为{},则表示不做任何动作
4:重复上面的1-3步骤,直到文件结束

一:基本使用


1:awk处理文本是以一行为单位,它会遍历记录
[root@localhost tmp]# awk '{print $0}' passwd #$0代表一条记录,注意要用----单引号 2:输出指定列(字段)
[root@localhost tmp]# cat test.txt
aaa bbb ccc ddd
eee fff hhh iii
jjj kkk lll mmm
nnn ooo ppp qqq
[root@localhost tmp]# awk '{print $1,$3}' test.txt #默认分隔符就是空格
aaa ccc
eee hhh
jjj lll
nnn ppp 3:修斯一下表头和表尾
[root@localhost tmp]# awk -F ':' 'BEGIN{print "Line Col User "} {print NR,NF,$1}END{print "--------"FILENAME"--------"}' passwd
Line Col User
1 7 root
2 7 bin
3 7 daemon
4 7 adm
5 7 lp
6 7 sync
7 7 shutdown
--------passwd-------- [root@localhost tmp]# awk -F ':' 'BEGIN{print "User-UID-GID "} {print $1,$3,$4} END {print " "}' passwd
User-UID-GID
root 0 0
bin 1 1
daemon 2 2
adm 3 4
lp 4 7
sync 5 0
shutdown 6 0
##注意:print的字符串要用双引号括起来,不要忘记写被处理的文件
##BEGIN和END都不参与循环过程
##:BEGIN:表示在awk对文件处理之前---首先被执行
##:END:表示在awk对所有文件行处理完之后--才被执行 4:巧妙的显示奇数行/偶数行
[root@localhost tmp]# awk 'NR%2==0{next} {print NR,$0}' passwd
1 root:x:0:0:root:/root:/bin/bash
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
...
##:NR内部变量,代表当前处理的行数;next:忽略后面指定的动作,直接进入下一行进行处理 [root@localhost tmp]# awk 'NR%2==1 {next}{print NR,$0}' passwd #输出偶数行 5:固定行数并合并
[root@localhost tmp]# cat -n input
1 one
2 two
3 three
4 four
5 five
6 six
7 seven
8 eight
9 nine
10 ten [root@localhost tmp]# awk 'NR%3!=0{T=(T " " $0);next} {print T, $0;T=""}' input
one two three
four five six
seven eight nine
###
● 首先,上面式子由两部分组成:
◇ 第一部分:NR%3!=0{T=(T""$0);next}。
◇ 第二部分:{print T,$0;T=""}。
● 第一部分,表示当NR(文件的当前的行号)不是3的倍数时,先执行{T=(T""$0);next},然后执行第二部分的内容。当NR是3的倍数时,直接执行第二部分的内容。
● 语句{T=(T""$0);next}中的T=(T""$0)表示将字符型变量T、空格和变量$0三者的值进行连接,然后再赋值给变量T。也就是说,awk语句每读取一行都把这行的内容追加到变量T中。
● 而next的作用很关键,它表示不再执行第二部分的语句,而是直接进行下一行的处理,这样就能保证awk把每3行一组的内容都存储到变量T中。
● 第二部分{print T,$0;T=""}表示输出变量T和$0的内容,并且把变量T的内容清空。
● 通过第一部分和第二部分的语句,可以实现3行一组的前两行内容会存放到变量T中,当处理到第三行时,就会把所有之前存储的内容都输出出来,然后就会清空变量T,再进行下一组数据的处理。 [root@localhost tmp]# awk 'NR%3!=0{T=(T " " $0);next} {print T, $0;T=""} END{print " "$0} ' input
###输出最后一行 5:不定行数合并----用到正则表达式
[root@localhost tmp]# cat -n input2.txt
1 xiaoming worktime is
2 89
3 88
4 87
5 86
6
7 xiaoqiang worktime is
8 77
9 78
10 79
11 80
12
13 xiaohong worktime is
14 69
15 68
16 66
[root@localhost tmp]# awk 'BEGIN{print T=""} /worktime/{print T;T=$0;next} {T=T " " $0} END{print T}' input2.txt xiaoming worktime is 89 88 87 86
xiaoqiang worktime is 77 78 79 80
xiaohong worktime is 69 68 66 ###分为4个部分:1:BEGIN{print T=""}:开始awk处理每行记录是,先执行的action
2: /worktime/ 模式匹配,匹配成功则执行{print T;T=$0;next}
3: 匹配不成功则执行{T=T " " $0}
4:END{print T}:awk处理完之后,最后执行的。 6:合并所有的行
[root@localhost tmp]# awk '{T=T " " $0}END{print T}' input.txt
one two three four five six seven eight nine ten

二:内置变量

name description
NR 每行的记录号---行号
NF 字段数量的变量--字段总数,列好
FILENAME 正在处理的文件名
1:打印内置变量
[root@localhost tmp]# awk -F ':' '{print NR,NF,FILENAME}' passwd
1 7 passwd
2 7 passwd
3 7 passwd
4 7 passwd
5 7 passwd
6 7 passwd
7 7 passwd
2:打印行号,列数和用户名
[root@localhost tmp]# awk -F ':' '{print "Line: "NR,"Col: "NF,"User:" $1}' passwd
Line: 1 Col: 7 User:root
Line: 2 Col: 7 User:bin
Line: 3 Col: 7 User:daemon
Line: 4 Col: 7 User:adm
Line: 5 Col: 7 User:lp
Line: 6 Col: 7 User:sync
Line: 7 Col: 7 User:shutdown
[root@localhost tmp]# awk -F ':' '{printf("Line: %s,Col: %s,User: %s\n",NR,NF,$1)}' passwd #方法二 3:显示passwd种用户ID大于100的行号和用户名
[root@localhost tmp]# awk -F ':' '{if($3>100){printf("Line: %s,Col: %s,User: %s\n",NR,NF,$1)}}' passwd
Line: 15,Col: 7,User: polkitd
Line: 17,Col: 7,User: avahi-autoipd
Line: 20,Col: 7,User: oracle

三:逻辑判断式

name description
,! 匹配正则表达式
==,!=,<,> 判断逻辑表达式
1:~使用,匹配以o开头用户id
[root@localhost tmp]# awk -F ':' '$1~/^o.*/{print $1}' passwd
operator
oracle
2:判断用户id大于100的用户
[root@localhost tmp]# awk -F ':' '$3>100{print $1}' passwd
polkitd
avahi-autoipd
oracle
[root@localhost tmp]#

四:案列

1:统计当前文件夹下的文件和文件夹的大小
1:[root@localhost usr]# du -sh * | sort -h ###文件实际占用的空间
2:[root@localhost usr]# ls -l | awk 'BEGIN{size=0}{size+=$5}END{print size/1024/1024 "M"} '
###du == disk usage (磁盘使用量,占用的磁盘空间)
###一个文件占用的磁盘空间和一个文件的大小是两码事情
###通常情况下,ls 显示的文件大小比du显示的磁盘占用空间小,比如文件系统的block是4K,一个13K的文件占用的空间是 13k/4k = 3.25 个block,一个block只能被一个文件占用,因此实际占用空间就是4个block,就是16K 2:统计当前passwd中的用户人数
[root@localhost tmp]# awk -F ':' 'BEGIN{count=0} $1!~/^$/{count++} END{print "count = " count}' passwd
count = 20
3:统计UID大于100的用户的UID
[root@localhost tmp]# awk -F ':' 'BEGIN{count=0} $3>100{count++;print $1} END{print "count = " count}' passwd
polkitd
avahi-autoipd
oracle
count = 3
###动作可以用;分开 方法2:
[root@localhost tmp]# awk -F ':' 'BEGIN{count=0} {if($3>100){name[count++]=$1}} END{for(i=0;i<count;i++)print i,name[i]}' passwd
0 polkitd
1 avahi-autoipd
2 oracle 4:杀死11005端口的所有进程
[root@localhost tmp]# ps -ef | grep 11005 | grep -v grep | awk '{print "kill -9 " $2 }' | sh

awk--基本操作的更多相关文章

  1. Linux awk学习

    零.awk标准语法 [root@wohaoshuai1 bbb]# echo "abcd" |awk 'BEGIN{print "wohaoshuai"} /a ...

  2. awk简单用法-(1)

    一.awk基本操作 awk指定多个分割符,分隔符中有:和空格,还有:和空格的组合,这个时候需要指定多个分隔符 -F'[ :]+',[ :]表示分隔符为:和空格,一个或者多个+号表示空格和:的组合也为一 ...

  3. sed与awk

    sed 格式 sed 选项 控制命令 文件或标准输入 sed 流程: (循环打印) sed是将文件里的每一行读入模式空间进行操作, sed选项 -r 支持正则表达 -n 取消默认打印 清空当前模式空间 ...

  4. Shell脚本之awk篇

    目录:一.概述二.awk基本语法格式三.awk基本操作四.awk条件及循环语句五.awk函数六.awk演示示例(源自于man手册) 一.概述 1. 产品概述: awk是一种编程语言,用于在linux/ ...

  5. 最全的三剑客和linux正则符号讲解

    第2章 linux符号系列与三剑客    194 2.1 特殊符号系列    194 2.1.1 普通符号系列    194 2.1.2 引号符号系列    196 2.1.3 定向符号    197 ...

  6. MySQL-->基础-->001-->MySQL基本操作

    一.MySQL安装 卸载mysql 第一步 sudo apt-get autoremove --purge mysql-server-5.0 sudo apt-get remove mysql-ser ...

  7. 【Linux】awk详细介绍

    awk简介 awk是一种使用方便且表现力很强的编程语言,它可以应用在多种不同的计算与数据处理任务中.由于awk天生提供对文件中文本分列进行处理,所以如果一个文件中的每行都被特定的分隔符(常见的是空格) ...

  8. AWK入门指南

    一. AWK入门指南 Awk是一种便于使用且表达能力强的程序设计语言,可应用于各种计算和数据处理任务.本章是个入门指南,让你能够尽快地开始编写你自己的程序.第二章将描述整个语言,而剩下的章节将向你展示 ...

  9. OSX终端 命令行的一些基本操作

    本文转载至 http://blog.csdn.net/xdrt81y/article/details/24058959 osx终端命令 OSX终端 命令行的一些基本操作终端 命令行的一些基本操作很多朋 ...

  10. AWK程序设计语言

    一. AWK入门指南 Awk是一种便于使用且表达能力强的程序设计语言,可应用于各种计算和数据处理任务.本章是个入门指南,让你能够尽快地开始编写你自己的程序.第二章将描述整个语言,而剩下的章节将向你展示 ...

随机推荐

  1. JVM-GC算法(一)-标记清除算法

    首先,我们得知道根搜索算法,它可以解决我们应该回收哪些对象的问题,但是它显然还不能承担垃圾搜集的重任,因为我们在程序(程序也就是指我们运行在JVM上的JAVA程序)运行期间如果想进行垃圾回收,就必须让 ...

  2. eclipse外部导入Javaweb项目时,项目上出现红叉的一个可能的解决办法

    解决办法:http://blog.csdn.net/qq_32671287/article/details/52467885 进入项目包下的.settings目录,找到org.eclipse.wst. ...

  3. koa 基础(十六)koa 中 session 的使用

    1.app.js /** * koa 中 session 的使用 * 1.npm install koa-session --save * 2.const session = require('koa ...

  4. P2983 [USACO10FEB]购买巧克力

    P2983 [USACO10FEB]购买巧克力 题解 注意题目开 long long 贪心策略:价格从低到高,买够为止 反证:若剩下的有一个K”,比K小,那么交换,稳赚不赔 所以,在买K之前,所有比他 ...

  5. Android jni/ndk编程一:jni初级认识与实战体验

    Android平台很多地方都可以看到jni的身影,比如之前接触到一个投屏的项目,主要的代码是c/c++写的,然后通过Jni供Java层调用;另外,就拿Android系统中的Service来说,很多的S ...

  6. 集群中配置多台机器之间 SSH 免密码登录

    集群中配置多台机器之间 SSH 免密码登录 问题描述 由于现在项目大多数由传统的单台机器部署,慢慢转变成多机器的集群化部署. 但是,这就涉及到机器间的 SSH 免密码互通问题. 当集群机器比较多的时候 ...

  7. Mac下的Pycharm教程

    除非你是用记事本写代码,或者用vim写代码的大牛,那么推荐使用PyCharm编写Python代码. PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效 ...

  8. 【Lua程序设计第四版练习题答案】ch01 Lua语言入门

    联系1.1: 运行阶乘的示例并观察,如果输入负数,程序会出现什么问题?试着修改代码来解决问题.   -- 定义一个计算阶乘的函数 function fact (n) if n == 0 then re ...

  9. PJzhang:我发现一个有两个答案的数独题

    猫宁!!! 最近做数独题,发现了一个答案不唯一的数独,之前对此类数独有所耳闻,但是没有亲手发现,碰巧发现一个,很是欣喜.   下面展示了两个答案   第一个 ​​   第二个 ​​   绿色标签是答案 ...

  10. 【LeetCode】 454、四数之和 II

    题目等级:4Sum II(Medium) 题目描述: Given four lists A, B, C, D of integer values, compute how many tuples (i ...