曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 4999|回复: 3
打印 上一主题 下一主题

awk 基本应用举例

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2009-1-1 22:09:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
假设文件 pass.txt 的内容为:
yes:no:hi:hello:maybe:welcome
ok:awk:bird:amd:tmd:intel:ati
name:linux:unix:gnu:bsd:open
suse:ubuntu:fedora:redhat:now
china:usa:korea:japan:enland:old

awk 打印出含有 welcome 字样的一行:
[beyes@localhost basic_test]$ awk '/welcome/' pass.txt
yes:no:hi:hello:maybe:welcome

打印出文本中的第一列内容:
[beyes@localhost basic_test]$ awk -F: '{print $1}' pass.txt     
yes
ok
name
suse
china
说明:
1、上面 -F: 中的 -F参数后面接文本的分隔符,上面文本的分隔符为冒号 :
2、Each field in the input record may be referenced by its  position,  $1,$2,  and so on.  $0 is the whole record.
   输入记录中的每一个域可以由 $1,$2 等等这样的位置参数来指定。$0 指的是整个记录。下面的例子可以看到:

输入:
[beyes@localhost basic_test]$ awk -F: '{print $3}' pass.txt

[beyes@localhost basic_test]$ awk -F: '{print $(n=3)}' pass.txt

都可以看到输出

hi
bird
unix
fedora
korea

若指定的是参数 $0 ,那么输出的是整个文本内容。

带有进一步限制性的选择输出,如输入以下命令并可以看到输出:
[beyes@localhost basic_test]$ awk -F: '/awk/{print $1,$2}' pass.txt
ok awk
解读:
在引号的命令中,/awk/ 表示,先要找到含有 awk 字样的行,然后接着输出这行的 $1 和 $2 两个域的内容。

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
沙发
 楼主| 发表于 2009-1-1 22:54:56 | 只看该作者

awk(由管道输入)

先看一下我的磁盘使用情况:
[root@localhost basic_test]# df -k
文件系统               1K-块        已用     可用 已用% 挂载点
/dev/mapper/VolGroup00-LogVol00
                      36851520   9511660  25437680  28% /
/dev/hda1               101086     32316     63551  34% /boot
tmpfs                   206640         0    206640   0% /dev/shm
/dev/sda5             20650996   4227016  15374940  22% /media/disk
/dev/sda3             71682028    104776  71577252   1% /mnt/windos-2
/dev/sda2             71682028  35576204  36105824  50% /mnt/windos-1
/dev/sda1             71681996   5870980  65811016   9% /mnt/windos-3
把剩余空间大于 16000000K 的磁盘分区输出来看看:
[root@localhost basic_test]# df -k | awk '$4>16000000'
文件系统               1K-块        已用     可用 已用% 挂载点
                      36851520   9511696  25437644  28% /
/dev/sda3             71682028    104776  71577252   1% /mnt/windos-2
/dev/sda2             71682028  35576204  36105824  50% /mnt/windos-1
/dev/sda1             71681996   5870980  65811016   9% /mnt/windos-3
说明:
在 df -k 输出的内容中,是以“多个空格”来分隔开的;这些“空格”在 awk 看来都只一种类型的分隔符。而上面的命令中,$4 代表第 4 号位置---即“可用”部分(磁盘分区剩余空间)。

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
板凳
 楼主| 发表于 2009-1-9 18:34:29 | 只看该作者

BEGIN 和 END 模式的使用

设 pass.txt 中的内容为:
yes:no:hi:hello:maybe:welcome

ok:awk:bird:amd:tmd:intel:ati

name:linux:unix:gnu:bsd:open
suse:ubuntu:fedora:redhat:now
china:usa:korea:japan:enland:old

mtime
使用 BEGIN 和 END :
[beyes@localhost ~]$ awk -F: 'BEGIN {print "name        passwd\\n---------------"} {print $1"\\t"$2 } END {print "end-of-file" }' pass.txt
name        passwd
---------------
yes     no

ok      awk

name    linux
suse    ubuntu
china   usa

mtime
end-of-file

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
地板
 楼主| 发表于 2009-1-1 23:39:23 | 只看该作者

awk 格式化输出

看一下 date 命令的输出:
[root@localhost basic_test]# date
2009年 01月 01日 星期四 23:39:34 CST

用 awk 来调整一下输出:
[root@localhost basic_test]# date | awk '{print "Date:" $1 "\\nTime:" $5}'
Date:2009年
Time:23:41:17
说明:
$1 取第一部分 2009年;  \\n 换行; $5 截取了当前 date 出的时间
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-18 11:00 , Processed in 0.101097 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表