红联Linux门户
Linux帮助

shell之awk

发布时间:2007-02-27 16:00:37来源:红联作者:Kesirst
  awk 是 Linux 上功能最为强大的工具之一。它本身实际上是一种编程语言,可以实现复杂的逻辑语句,还可以简化部分文本的提取。在本文那中我们将不会详细对其进行介绍,而是快速了解一下它的语法,并尝试几个实际的例子。

  awk 命令包括一个模式和由一条或多条语句构成的操作,语法如下所示:

  awk '/pattern/ {action}' file

  请注意:

  awk 测试指定文件中的每个记录是否符合模式匹配。如果找到匹配项,就执行指定的操作。
  awk 可以在管道中作为过滤器,如果没有指定文件,它也可以从键盘(标准输入)中接收输入。
  一种非常有用的操作是打印数据!下面是如何引用一条记录中的域。

  $0 ---- 整条记录
  $1 ---- 该记录中的第一个域
  $2 ---- 该记录中的第二个域

  我们还可以从一条记录中提取多个域,之间使用逗号分开。

  举例来说,要提取 /etc/passwd 文件中的第 6 个域,命令如下:

引用:
# awk -F: '{print $6}' /etc/passwd

/root

/bin

/sbin

/var/adm

/var/spool/lpd

/sbin

/sbin

/sbin

/var/spool/mail

/etc/news

/var/spool/uucp


  注意 -F 是由预先定义的 FS 变量所定义的输入域分隔符。在我们这个例子中是空格。

  要从 /etc/passwd 文件中提取第一个和第六个域,命令如下:

引用:
# awk -F: '{print $1,$6}' /etc/passwd

root /root

bin /bin

daemon /sbin

adm /var/adm

lp /var/spool/lpd

sync /sbin

shutdown /sbin

halt /sbin

mail /var/spool/mail

news /etc/news

uucp /var/spool/uucp

operator /root


  要在域之间使用短横线代替冒号来打印这个文件的内容,命令如下:

引用:
# awk -F: '{OFS="-"}{print $1,$6}' /etc/passwd

root-/root

bin-/bin

daemon-/sbin

adm-/var/adm

lp-/var/spool/lpd

sync-/sbin

shutdown-/sbin

halt-/sbin

mail-/var/spool/mail

news-/etc/news

uucp-/var/spool/uucp

operator-/root


  要使用短横线作为域之间的分隔符来打印文件,并且只以逆序打印第一个域和第六个域,命令如下:

引用:
# awk -F: '{OFS="-"}{print $6,$1}' /etc/passwd

/root-root

/bin-bin

/sbin-daemon

/var/adm-adm

/var/spool/lpd-lp

/sbin-sync

/sbin-shutdown

/sbin-halt

/var/spool/mail-mail

/etc/news-news

/var/spool/uucp-uucp

/root-operator
文章评论

共有 0 条评论