linux操作系统-awk基本用法

gawk (gnu awk)
Unix中awk的GNU版本,完成grep和sed的工作
支持数学运算,流程该控制内置大量的变量和函数

awk命令工作原理:
与sed一样, 均是一行一行的读取、处理
sed作用于一整行的处理, 而awk将一行分成数个字段来处理

awk的数据字段变量:
$0表示整行文本
$1表示文本中第一个数据字段
$2表示文本中第二个数据字段
$n表示文本中第n个数据字段

awk的用-F来指定分隔符:
默认的字段分隔符是任意空白字符(空格或者TAB)
举例对比cut和awk的区别

awk的命令的执行过程:
执行BEGIN{commands}语句块中的语句
从文件或stdin中读取第1行,
有无模式匹配, 若无则执行{}中的语句,
若有则检查该整行与pattern是否匹配, 若匹配, 则执行{}中的语句,
若不匹配则不执行{}中的语句,接着读取下一行
重复这个过程, 直到所有行被读取完毕
执行END{commands}语句块中的语句

awk命令的基本语法:
awk -F 分隔符  ‘/模式/{动作}’  输入文件
awk的指令一定要用单引号括起
awk的动作一定要用花括号括起
模式可以是正则表达式、条件表达式或两种组合
如果模式是正则表达式要用/定界符
多个动作之间用;号分开

awk基本命令示例:
awk ‘/bash/‘ /etc/passwd
只有模式没有动作结果和grep一样,显示$0
who | awk ‘{print $2}‘
只有动作没有模式就直接执行动作
awk -F: ‘/^h/{print $1,$7}‘ /etc/passwd
print执行显示功能将文本输出到STDOUT
以冒号为分隔符,显示以h开头的行的第一列和第七列
awk -F: ‘/^[^h]/{print $1,$7}‘ /etc/passwd
不显示以h开头的行的第一列和第七列
 awk -F ‘[:/]‘ ‘{print $1,$10}‘ /etc/passwd
以:或者/作为分隔符显示第1列和第10列

awk命令的操作符:
正则表达式和bash一致
数学运算:+,-,*,/, %,++,- -
逻辑关系符:&&, ||, !
比较操作符:>,<,>=,!=,<=,==  ~ !~
文本数据表达式:== (精确匹配)
~波浪号表示匹配后面的模式
who | awk ‘$2 ~ /pts/{print $1}‘
awk -F: ‘$3 ~ /\<...\>/ {print $1,$3}‘ /etc/passwd
seq 100 | awk ‘$1 % 5 == 0 || $1 ~ /^1/{print $1}‘
 awk -F: ‘$1 == "root"{print $1,$3}‘ /etc/passwd

awk基本命令示例:
awk -F: ‘$3>=500{print $1}‘ /etc/passwd
显示UID大于等于500行的用户名
awk -F: ‘$3>=500 && $3<=60000{print $1}‘ /etc/passwd
显示普通用户名
awk -F: ‘$3 != $4 {print $1}‘ /etc/passwd
显示UID不等于GID的用户名
awk -F: ‘/^h/ && /bash/{print $1}‘ /etc/passwd
显示用户名以h开头且包含hash字段的普通用户
ps aux | awk ‘$2 <=10 {print $11}‘
awk ‘BEGIN{print "line one\nline two\nline three"}‘
显示后面三行
awk ‘END{print "line one\nline two\nline three"}‘
按ctrl+D开始显示后面三行
awk ‘BEGIN{print "start..."}{print $1}END{print "end..."}‘ test
显示文件的内容并在前面加上start和后面加上end
awk ‘BEGIN{i=0}{i++}END{print i}‘ /etc/passwd
显示文件的行数
awk ‘{print NF}‘ /etc/grub.conf
显示每行的字段数目
awk ‘{print $1,$NF}‘ /etc/grub.conf
显示每行的第一字段 和最后一个字段
awk ‘{print NR,$0}‘ /etc/grub.conf
显示每行的内容和行号
awk -F: ‘BEGIN{OFS="---"}{print $1,$7}‘ /etc/passwd
显示第一列和第七列,中间用---隔开
awk ‘BEGIN{FS=":"}/bash$/{print NR,$1}END{print NR}‘ /etc/passwd
显示符合模式的用户名和所在的行号最后显示总行号

awk基本命令示例:
awk ‘NR==3,NR=5’ /etc/grub.conf
显示文件的3到5行
awk   ‘NR<=10‘ /etc/fstab
显示文件的前10行

分析下面三条命令的区别,为什么
awk ‘BEGIN{print NR}‘ /etc/passwd    0
awk ‘{print NR}‘ /etc/passwd       总行数
awk ‘END{print NR}‘ /etc/passwd  总行数
分析下面命令的执行结果
awk -F: ‘{print $NR}‘ /etc/passwd
[[email protected] lianxi]# awk -F: ‘{print $NR}‘ passwd
root
x
2
4
lp
/sbin
/sbin/shutdown
[[email protected] lianxi]#
awk -F: ‘{print NR, NF, $1, $NF, $(NF-1)}‘ /etc/passwd

[[email protected] lianxi]# awk -F: ‘{print NR, NF, $1, $NF, $(NF-1)}‘ /etc/passwd
1 7 root /bin/bash /root
2 7 bin /sbin/nologin /bin
3 7 daemon /sbin/nologin /sbin
4 7 adm /sbin/nologin /var/adm
5 7 lp /sbin/nologin /var/spool/lpd
6 7 sync /bin/sync /sbin
7 7 shutdown /sbin/shutdown /sbin
8 7 halt /sbin/halt /sbin
9 7 mail /sbin/nologin /var/spool/mail
10 7 uucp /sbin/nologin /var/spool/uucp
11 7 operator /sbin/nologin /root
12 7 games /sbin/nologin /usr/games
13 7 gopher /sbin/nologin /var/gopher
14 7 ftp /sbin/nologin /var/ftp
15 7 nobody /sbin/nologin /
16 7 dbus /sbin/nologin /
17 7 usbmuxd /sbin/nologin /
18 7 rpc /sbin/nologin /var/cache/rpcbind
19 7 vcsa /sbin/nologin /dev
20 7 rtkit /sbin/nologin /proc
21 7 abrt /sbin/nologin /etc/abrt
22 7 avahi-autoipd /sbin/nologin /var/lib/avahi-autoipd
23 7 saslauth /sbin/nologin /var/empty/saslauth
24 7 postfix /sbin/nologin /var/spool/postfix
25 7 haldaemon /sbin/nologin /
26 7 gdm /sbin/nologin /var/lib/gdm
27 7 ntp /sbin/nologin /etc/ntp
28 7 apache /sbin/nologin /var/www
29 7 mysql /bin/bash /var/lib/mysql
30 7 rpcuser /sbin/nologin /var/lib/nfs
31 7 nfsnobody /sbin/nologin /var/lib/nfs
32 7 pulse /sbin/nologin /var/run/pulse
33 7 sshd /sbin/nologin /var/empty/sshd
34 7 tcpdump /sbin/nologin /
35 7 squid /sbin/nologin /var/spool/squid
36 7 named /sbin/nologin /var/named
37 7 tss /sbin/nologin /dev/null
38 7 ldap /sbin/nologin /var/lib/ldap
39 7 wl /bin/bash /home/wl

只显示df -h结果的第一列文件系统
显示passwd文件的第5行和第10行的行号和用户名
使用NF变量显示passwd文件倒数第二列的内容
awk -F: ‘{print $(NF-1)}‘ passwd
显示passwd文件中第5到第10行的用户名
awk -F: ‘NR==1,NR==10 {print $1}‘ passwd
显示passwd文件中第7列不是bash的用户名
awk -F: ‘/nologin$/{print $1}‘ passwd
显示passwd文件中行号是5结尾的行号和行
 awk -F: ‘NR==5{print NR,$0}‘ passwd
用ifconfig只显示ip(不能使用tr或者cut命令)
ifconfig eth0 |awk -F: ‘NR==2{print $2}‘ |awk -F‘ ‘ ‘{print $1}‘
使用awk显示eth0的入站流量和出站流量(字节)
ifconfig eth0 |awk -F" " ‘NR==8{print $3,$4,$7,$8}‘
使用awk命令统计以r开头的用户数目,显示如下效果
查找结果
root
rpc
rtkit
rpcuser
4

awk命令的引用shell变量:
-v 引入shell变量
#!/bin/bash
name=haha
echo | awk ‘{print $name}‘
#!/bin/bash
name=haha
echo |awk -v abc=$name ‘{print abc,$name}‘

awk编程语言内置了很多函数:
例如利用length计算字符数目的函数来检查有无空口令用户
awk -F: ‘length($2)==0{print $1}‘ /etc/passwd /etc/shadow
显示文件中超过60个字符的行
wk ‘length($0)>60 {print NR,$0}‘ /etc/passwd

if语句
单分支
if (condition)statement1
awk -F: ‘{if($1 ~ /\<...\>/)print $0}‘ /etc/passwd
awk -F: ‘{if($3 >= 500)print $1,$7}‘ /etc/passwd
双分支
if (condition)statement1 ;else statement2
awk -F: ‘{if($3 != 0) print $1 ; else print $3}‘ /etc/passwd
多分支
awk -F: ‘{if($1=="root") print $1; else if($1=="ftp") print $2; else if($1=="mail") print $3; else print NR}‘ /etc/passwd

利用awk的system命令在/tmp下建立/etc/passwd中与用户名同名的目录:
awk -F: ‘{system("mkdir /tmp/"$1)}‘ /etc/passwd
 awk -F" " ‘{if (length($7)>60) {print NR,$3,$4,$5,$6,substr($7 1,55)} else {print NR,$3,$4,$5,$6,$7}}‘ wl.txt     取前55个

awk进行列求和:
统计/etc目录下以.conf结尾的文件的总大小
find /etc/ -type f -name "*.conf" |xargs ls -l | awk ‘{sum+=$5} END{print sum}‘
如果要匹配第一列的才累加,需要用到awk的数组和for循环
cat xferlog | cut -d‘ ‘ -f7,8 | sort -n > /tmp/file1
awk ‘{a[$1]+=$2}END{for(i in a) print i"  "a[i]/1024/1024}‘ /tmp/file1 | sort -rn -k2
awk进行行求和
echo 1 2 3 4 5 | awk ‘{for(i=1;i<=NF;i++) sum+=$i; print sum}‘
seq -s ‘ ‘ 100 | awk ‘{for(i=1;i<=NF;i++) sum+=$i; print sum}‘

时间: 2024-10-27 19:49:31

linux操作系统-awk基本用法的相关文章

Linux sed 和 awk的用法

sed用法: 原文链接:http://www.cnblogs.com/dong008259/archive/2011/12/07/2279897.html sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法sed命令行格式为:         sed [-nefri] 'command' 输入文本 常用选项:        -n∶使用安静(silent)模式.在一般 sed 的用法中,所有来自

Linux中awk后面的RS, ORS, FS, OFS 用法

Linux中awk后面的RS, ORS, FS, OFS 含义 一.RS 与 ORS 差在哪 我们经常会说,awk是基于行列操作文本的,但如何定义"行"呢?这就是RS的作用.  默认情况下,RS的值是\n.下面通过实例来理解下RS. echo '1a2a3a4a5' | awk '{print $1}' 1a2a3a4a5 echo '1a2a3a4a5' | awk 'BEGIN{RS="a"}{print $1}' 1 2 3 4 5我们可以看到,在更改了RS的

linux中快捷键的用法

linux中快捷键的用法 1.1 常见快捷键 ctrl + a 把光标移动到行首 ctrl + e 把光标移动到行尾 ctrl + c 撤销当前的操作=cancel ctrl + d logout命令(当前行没有任何内容,退出当前用户),删除光标所在位置后面的一个符号,文本 ctrl + l(小写字母L)清除屏幕内容 ctrl +u 剪切光标所在位置到行首内容 ctrl +k 剪切光标所在位置到行尾内容 ctrl +y 粘贴 ctrl + r search搜索历史命令,继续搜索,查找历史命令 

linux操作系统-给文本添加 &#39; -单引号,一般转成CSV格式时使用

[[email protected] ~]# cat 1.txt1ms2ms3ms4ms5ms [[email protected] ~]# cat 1.txt | awk '{print $1"\047"}'1ms'2ms'3ms'4ms'5ms' [[email protected] ~]# cat 1.txt | awk '{print $1"\047"}' > 2.txt[[email protected] ~]# cat 2.txt1ms'2ms'3

Linux操作系统及应用课程笔记 索引

第0部分  软件的安装与配置 Linux下软件的安装与配置 第1部分*   绪论 第2部分*  Linux的安装过程 第3部分   系统Shell和常用命令 Shell文件相关常用命令及参数总结 Linux下常用命令 第4部分  VI编辑器 Linux下vi编辑器的使用 <<学习vi和vim编辑器>>1 <<学习vi和vim编辑器>>2 第5部分  Shell脚本 Shell入门之脚本管理 Shell入门之测试操作 Shell入门之条件循环 Shell入门之

使用 /proc 文件系统来访问 linux操作系统 内核的内容 &amp;&amp; 虚拟文件系统vfs及proc详解

http://blog.163.com/he_junwei/blog/static/19793764620152743325659/ http://www.01yun.com/other/20130422/366044.html 使用 /proc 文件系统来访问 Linux 内核的内容 这个虚拟文件系统在内核空间和用户空间之间打开了一个通信窗口 简介: /proc 文件系统是一个虚拟文件系统,通过它可以使用一种新的方法在 Linux? 内核空间和用户空间之间进行通信.在 /proc 文件系统中,

linux sed&awk详解

sed sed为文本处理三剑客之一.本身就是一个管道命令,可以将文件进行增加,修改,删除,选取等操作. 格式:sed [-nrefi] [command] "文本字符串" 选项: -r: 支持扩展正则表达式: -n: 静默模式:(sed有个模式空间和保持空间,默认sed会将执行的结果保存到模式空间里面,而模式空间默认情况是输出在屏幕上,加了-n,则阻止将模式空间的内容输出到屏幕上) -f:/path/to/script_file:从指定的文件中读取脚本并运行 -e script1 -e

linux 操作系统下c语言编程入门

2)Linux程序设计入门--进程介绍 3)Linux程序设计入门--文件操作 4)Linux程序设计入门--时间概念 5)Linux程序设计入门--信号处理 6)Linux程序设计入门--消息管理 7)Linux程序设计入门--线程操作 8)Linux程序设计入门--网络编程 9)Linux下C开发工具介绍 1)Linux程序设计入门--基础知识 Linux下C语言编程基础知识 前言: 这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将 会学到以下内容: 源程序编

[Linux]谈谈如何学习Linux操作系统

一. 选择适合自己的linux发行版谈到linux的发行版本,太多了,可能谁也不能给出一个准确的数字,但是有一点是可以肯定的,linux正在变得越来越流行, 面对这么多的Linux 发行版,打算从其他系统转到linux系统来的初学者可能会感到困惑,即便是忠实的 Linux 用户也没有时间和精力去挨个尝试,因此初学者在学习linux的之前,需要有一个明确的方向,选择一个适合自己的系统开始学习linux至关重要!下面我们就分类介绍. 1.1 初学者入门首选-redhat系列在学习redhat系列li