awk擅长于对数据进行分析并生成报告,简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

使用方法:
awk '{pattern +action}' {filenames}

[root@limt01 ~]# cat /etc/passwd|awk -F: '{ print $1 }'
root
bin
daemon
adm
lp
sync
。。。

其中 -F:为指定分隔符为:

awk的内建变量:
$0 当前记录(这个变量中存放着整个行的内容)
$1~$n 当前记录的第n个字段,字段间由FS分隔
FS 输入字段分隔符默认是空格或Tab
NF 当前记录中的字段个数,就是有多少列
NR 已经读出的记录数,就是行号,从1开始,如果有多个文件话,这个值也是不断累加中。
FNR 当前记录数,与NR不同的是,这个值会是各个文件自己的行号
RS 输入的记录分隔符,默认为换行符
OFS 输出字段分隔符,默认也是空格
ORS 输出的记录分隔符,默认为换行符
FILENAME 当前输入文件的名字

1 指定分隔符

[root@limt01 tmp]# awk 'BEGIN{FS=":"} {print $1,$3,$6}' /etc/passwd
root 0 /root
bin 1 /bin
daemon 2 /sbin
adm 3 /var/adm
lp 4 /var/spool/lpd
sync 5 /sbin
shutdown 6 /sbin
halt 7 /sbin
mail 8 /var/spool/mail
operator 11 /root
games 12 /usr/games
ftp 14 /var/ftp
。。。

2 指定输出分隔符(OFS="\t")

[root@limt01 tmp]# awk -F: '{print $1,$3,$6}' OFS="\t" /etc/passwd
root 0 /root
bin 1 /bin
daemon 2 /sbin
adm 3 /var/adm
lp 4 /var/spool/lpd
sync 5 /sbin
shutdown 6 /sbin
halt 7 /sbin
mail 8 /var/spool/mail
operator 11 /root
games 12 /usr/games
ftp 14 /var/ftp
。。。

3 条件过滤输出

[root@limt01 tmp]# awk -F: '{ if( $1 ~ /root/ || $1 ~ /limt/) { print $1,$3,$6 } }' OFS="\t" /etc/passwd
root 0 /root
limt 1000 /home/limt
[root@limt01 tmp]# awk -F: '$1 ~ /root/ || $1 ~ /limt/  { print $1,$3,$6  }' OFS="\t" /etc/passwd
root 0 /root
limt 1000 /home/limt

4 重定向输出到指定文件

[root@limt01 tmp]# awk 'NR!=1{print $0 > "/tmp/passwd" }' /etc/passwd
[root@limt01 tmp]#
[root@limt01 tmp]# ls -lrt /tmp|tail
总用量 12
-rw-------. 1 root root 0 5月 20 21:36 yum.log
drwxr-xr-x. 2 root root 17 5月 20 21:43 hsperfdata_root
-rwx------. 1 root root 663 5月 20 21:48 ks-script-1AQjlc
drwx------. 3 root root 16 5月 22 08:44 systemd-private-HQgvzl
drwx------. 2 root root 23 5月 22 11:40 ssh-Hon4d3o0kn
-rw-r--r--. 1 root root 1184 5月 22 12:06 0
-rw-r--r--. 1 root root 1184 5月 22 13:24 passwd

5 -v带入外部变量到awk

[root@limt01 tmp]# x=6
[root@limt01 tmp]# awk -v val=$x '{print val}' /etc/passwd|less
6
6
6
6

6 printf函数

命令格式:
printf format,item1,item2……
使用要点:
1.format格式符必须使用
2.不会自动换行,需要手动添加行分隔符
3.format格式符中需要分别为后面的每个item指定一个格式符
格式符:都以%开头,后跟一个字符
%c:显示字符的ASCII码;
%i,%d:显示十进制整数;
%e,%E:科学计数法显示数值;
%f:显示浮点数;
%g,%G:以科学计数法格式或浮点数格式显示数值;
%s:字符串;
%u:无符号整数;
%%:显示%自身

[root@limt01 tmp]# netstat -an|awk '{printf "%-8s %-8s %-8s %-18s %-22s %-15s\n",$1,$2,$3,$4,$5,$6}'
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 52 192.168.1.105:22 192.168.1.103:62831 ESTABLISHED
tcp6 0 0 ::1:25 :::* LISTEN
tcp6 0 0 :::22 :::* LISTEN
udp 0 0 0.0.0.0:68 0.0.0.0:*
udp 0 0 192.168.1.105:123 0.0.0.0:*
udp 0 0 127.0.0.1:123 0.0.0.0:*
udp 0 0 0.0.0.0:123 0.0.0.0:*
udp 0 0 0.0.0.0:5353 0.0.0.0:*
udp 0 0 0.0.0.0:6480 0.0.0.0:*
udp 0 0 0.0.0.0:37782 0.0.0.0:*

awk中常见的模式类型:

1 /regular expression/:仅处理能被正则表达式匹配的

[root@limt01 tmp]# awk -F: '/^\<root\>/{print $1,$3}' /etc/passwd
root 0

2  relational expression:关系表达式,结果有真假之分,其结果为非0或非空字符串时为真,否则为假

[root@limt01 tmp]# awk -F: '$3>=500{print $1,$3}' /etc/passwd
polkitd 999
libstoragemgmt 998
chrony 997
limt 1000

awk中常用的控制语句:

1 if else语句
if (condition) statement [ else statement ]
if (condition) {statements;} [ else {statements;} ]

[root@limt01 tmp]# awk -F: '{if ($3>=500) {print $1," is a common user"}else{print $1,"is a systemuser"}}' /etc/passwd
root is a systemuser
bin is a systemuser
daemon is a systemuser
adm is a systemuser
lp is a systemuser
sync is a systemuser
shutdown is a systemuser
。。。

2 while循环语句

语法格式:
while (condition) statement
while (condition) {statements}

[root@limt01 tmp]# awk -F: '$1~/root/{i=1;while(i<=NF){print $i;i+=2}}' /etc/passwd
root
0
root
/bin/bash

3 for循环语句

for (expr1;expr2;expr3) {statements}
for ( variable assignment(条件赋值);condition(循环执行); iteration process(变量修正)) { statement1, statement2, ...}

[root@limt01 tmp]# awk '{for(i=1;i<=NF;i+=2){if (length($i)>=6)print $i }}' /etc/issue
Kernel

4 switch语句

5 break and continue
break[n]:退出当前循环
continue[n]:提前结束本轮循环,直接进入下轮循环

6 next
提前结束对本行的处理而进入下一行的处理

数组:因为awk中数组的下标可以是数字和字母,数组的下标通常被称为关键字(key)。值和关键字都存储在内部的一张针对key/value应用hash的表格里。由于hash不是顺序存储,因此在显示数组内容时会发现,它们并不是按照你预料的顺序显示出来的。数组和变量一样,都是在使用时自动创建的,awk也同样会自动判断其存储的是数字还是字符串。一般而言,awk中的数组用来从记录中收集信息,可以用于计算总和、统计单词以及跟踪模板被匹配的次数等等。

数组,关联数组:array[index-expression]
要遍历数组中的每一个元素,需要使用如下特殊结构:
for (var in array) {for body}
其var会遍历array的索引;而非元素值

[root@limt01 tmp]#  ss -tan |awk '!/State/{state[$1]++}END{for (i in state) {print i,state[i]}}'
LISTEN 4
ESTAB 1

使用脚本进行文本、数据处理:

#!/bin/awk -f
#运行前
BEGIN {
math= 0
english= 0
computer= 0 printf"NAME NO. MATH ENGLISH COMPUTER TOTAL\n"
printf"---------------------------------------------\n"
}
#运行中
{
math+=$3
english+=$4
computer+=$5
printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5
}
#运行后
END{
printf"---------------------------------------------\n"
printf "TOTAL:%10d %8d %8d \n", math, english, computer
printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR,computer/NR
}

文件处理命令:awk的更多相关文章

  1. linux常用命令 awk命令

    awk命令 awk [选项] '条件1{动作1} 条件2{动作2}...' 文件名 条件(Pattern) *) 一般使用关系表达式作为条件 *) x>10 判断变量x是否大于10 *) x&g ...

  2. Sed 静默替换文件内容 以及 awk 的简单使用

    1. Sed的help 鸟哥说的 学东西 先看 help 先看man 再google 不好FQ再百度.. Usage: sed [OPTION]... {script-only-if-no-other ...

  3. Linux命令awk

    1.简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大. 简单来说awk就是把文件逐行读入,默认以空格为分隔符将每行切片,切开的部 ...

  4. Linux查找并删除重复文件的命令行fdupes工具,dupeGuru图形工具

    查了几十个网页,找到这个接近满意的解决方案http://unix.stackexchange.com/questions/146197/fdupes-delete-files-aft... 不过正则里 ...

  5. 【转】如何利用多核CPU来加速你的Linux命令 — awk, sed, bzip2, grep, wc等

    如何利用多核CPU来加速你的Linux命令 — awk, sed, bzip2, grep, wc等   你是否曾经有过要计算一个非常大的数据(几百GB)的需求?或在里面搜索,或其它操作——一些无法并 ...

  6. Linux日常之命令awk

    参考:http://www.zsythink.net/archives/tag/awk/ 一. 命令awk简介 1. awk是一种编程语言,用于对文本和数据进行处理的 2. 具有强大的文本格式化能力 ...

  7. 一个不会coding的girl Linux日常之命令awk

    Linux日常之命令awk 参考:http://www.zsythink.net/archives/tag/awk/ 一. 命令awk简介 1. awk是一种编程语言,用于对文本和数据进行处理的 2. ...

  8. linux命令-awk,sort,uniq

    学习地址:http://man.linuxde.net/awk#awk的工作原理 awk 选项参数说明: -F fs or --field-separator fs 指定输入文件折分隔符,fs是一个字 ...

  9. Shell系列(22)- 字符截取命令awk

    简介 awk是一个数据处理工具,相比于sed常常作用于一整行的处理,awk则比较倾向于将一行分成数个"字段"来处理 awk的流程是依次读取每一行数据,读取完一行数据后,进行条件判断 ...

  10. 第3章 Linux常用命令(3)_文件搜索命令

    3. 文件搜索命令 3.1 文件搜索:find (1)find命令 命令名称 find 命令所在路径 /bin/find 执行权限 所有用户 语法 find [搜索范围] [-选项] [匹配条件] - ...

随机推荐

  1. 【转】linux查看及修改文件权限以及相关

    linux查看及修改文件权限以及相关 查看文件权限的语句: 在终端输入: ls -l xxx.xxx (xxx.xxx是文件名) 那么就会出现相类似的信息,主要都是这些: -rw-rw-r-- 一共有 ...

  2. 在程序中执行shell命令

    在linux系统下的操作中我们会经常用到shell命令来进行,一开始学习进程的时候对于shell命令也进行了思考,认为shell命令就是一个进程的外壳,经过了后来的学习对于这一点也有了更多的认识. 用 ...

  3. HashMap和 Hashtable的比较

    Hashtable 和 HashMap的比较 1.  HashMap可以接受null(HashMap可以接受为null的键值(key)和值(value), HashTable不可以接受为null的键( ...

  4. Linux 添加完硬盘后,如何挂载和分区、以及其他的分区不足,如何从新的硬盘上挂载借用

    挂载好新硬盘后输入fdisk -l命令看当前磁盘信息 可以看到除了当前的第一块硬盘外还有一块sdb的第二块硬盘,然后用fdisk /dev/sdb 进行分区 进入fdisk命令,输入h可以看到该命令的 ...

  5. JavaScript Array map() 方法

    语法: array.map(function(currentValue,index,arr), thisValue) currentValue:必须.当前元素的值index:可选.当期元素的索引值ar ...

  6. vue2.0 组件之间的数据传递

    组件间的数据传递// 父组件<template><div class="order"><dialog-addpro v-on:closedialog= ...

  7. java 多态和内部类

    接口跟接口之间存在继承关系 一个接口可以继承多个接口 一个非抽象类:必须实现接口中的所有方法 一个抽象类实现接口  可以不实现接口中的方法  但是继承与抽象类的类必须要是实现接口中的方法 多态:一个对 ...

  8. express框架

    一.express的使用 安装express 在根目录下输入 npm install express 引入express的包 const express = require("express ...

  9. 模拟搭建Web项目的真实运行环境(七)

    下面这个是mongo驱动的小案例,里面也有涉及到一点redis的操作 https://github.com/SuperRocky/MyMongoDriver 接下来通过几张图片主要介绍一下每个文件的具 ...

  10. 当攻击者熟读兵法,Camouflage病毒实战演示暗度陈仓之计

    "明修栈道,暗度陈仓"的典故许多人都听说过,该典故出自楚汉争霸时期,刘邦意图进入关中,需要攻下关中咽喉之地--陈仓.韩信献出一计:表面上浩浩荡荡地修复通往陈仓的栈道以迷惑陈仓守将, ...