Linux awk 命令

awk是Unix系统中文本处理工具,叫AWK是因为其取了三位创始人 Alfred AhoPeter Weinberger, 和 Brian Kernighan 的Family Name的首字符。

使用awk的方式有:

1.命令行方式awk [-F  field-separator]  ‘commands‘  input-file(s)
其中,commands 是真正awk命令,[-F 域分隔符]是可选的。 input-file(s) 是待处理的文件。在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。 command 命令需要在花括号中定义。

2.将所有的awk命令插入一个单独文件,然后调用:
awk -f awk-script-file input-file(s)
其中,-f选项加载awk-script-file中的awk脚本,input-file(s)跟上面的是一样的。

以etc/passwd为例,说明awk使用。

~$ cat passwd.log
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
ym65536:x:1000:1000:ubuntu-10-10,,,:/home/ym65536:/bin/bash
sshd:x:114:65534::/var/run/sshd:/usr/sbin/nologin

各个冒号分隔符含义:

login_name:passwd:UID:GID:user_name:home_dir:shell_path

1. 打印

[email protected]:~# awk -F ‘:‘ ‘{print $1, $4}‘ passwd.log
root 0
daemon 1
bin 2
man 12
mail 8
nobody 65534
ym65536 1000
sshd 65534
  • 其中单引号中的被大括号括着的就是awk的语句,注意,其只能被单引号包含。
  • 其中的$1..$n表示第几例。注:$0表示整个行

格式化输出和C类似

[email protected]:~# awk -F ‘:‘ ‘{printf "%-8s %-8s\n", $1, $4}‘ passwd.log
root     0
daemon   1
bin      2
man      12
mail     8
nobody   65534
ym65536  1000
sshd     65534   

2、过滤

a) 过滤条件:GID=65534且shell path = /bin/sh

[email protected]:~# awk -F: ‘$4==65534 && $7=="/bin/sh"‘ passwd.log
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh

其中的“==”为比较运算符。其他比较运算符:!=, >, <, >=, <=

b) 显示GID>10的行

[email protected]:~# awk -F: ‘$4>10 {print $0}‘ passwd.log
man:x:6:12:man:/var/cache/man:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
ym65536:x:1000:1000:ubuntu-10-10,,,:/home/ym65536:/bin/bash
sshd:x:114:65534::/var/run/sshd:/usr/sbin/nologin

3、内建变量

awk的一些内建变量:

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

打印行号大于6的行的信息:

[email protected]:~# awk  -F ‘:‘  ‘NR > 6 {print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}‘ passwd.log
filename:passwd.log,linenumber:7,columns:7,linecontent:ym65536:x:1000:1000:ubuntu-10-10,,,:/home/ym65536:/bin/bash
filename:passwd.log,linenumber:8,columns:7,linecontent:sshd:x:114:65534::/var/run/sshd:/usr/sbin/nologin

4、BEGIN/END

[email protected]:~# awk -F: ‘BEGIN {print "longin UID"} {print $1,$3} END {print "END"}‘ passwd.log
longin UID
root 0
daemon 1
bin 2
man 6
mail 8
nobody 65534
ym65536 1000
sshd 114
END

awk工作流程是这样的:先执行BEGING,然后读取文件,读入有/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域,随后开始执行模式所对应的动作action。接着开始读入第二条记录······直到所有的记录都读完,最后执行END操作

5、字符串匹配

awk使用正则表达式进行匹配

a) 匹配第四列(GID)为65534的行,然后打印1,3列。

[email protected]:~# awk -F: ‘$4 ~ /65534/ {print $1,$3}‘ OFS=‘\t‘ passwd.log
nobody    65534
sshd    114

//中的内容即为要匹配的内容。

b) 向grep一样匹配root字符串

[email protected]:~# awk -F: ‘/root/‘ passwd.log
root:x:0:0:root:/root:/bin/bash

c) 匹配root或者ym

[email protected]:~# awk -F: ‘/root|ym/‘ passwd.log
root:x:0:0:root:/root:/bin/bash
ym65536:x:1000:1000:ubuntu-10-10,,,:/home/ym65536:/bin/bash

6、if语句

awk中的if语句和C语言类似,使用如下:

if (expression)
{
    statement1;
}
else if (expression1)
{
    statement2;
}
else
{
    statement3;
}#注意每条语句以分号;结尾

把第一列匹配root或ym的行放入文件1.txt,其余的放入文件2.txt

awk -F: ‘{if($1 ~ /root|ym/) print > "1.txt"; else print > "2.txt"}‘ passwd.log
[email protected]:~# ls
1.txt  2.txt  passwd.log
root:x:0:0:root:/root:/bin/bash
ym65536:x:1000:1000:ubuntu-10-10,,,:/home/ym65536:/bin/bash
[email protected]:~# cat 2.txt
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
sshd:x:114:65534::/var/run/sshd:/usr/sbin/nologin

7、统计

统计当前路径下txt文件大小的和:

[email protected]:~# ls -l *.txt
-rw-r--r-- 1 root root  92 2015-02-23 23:11 1.txt
-rw-r--r-- 1 root root 236 2015-02-23 23:11 2.txt
[email protected]:~# ls -l *.txt |awk ‘BEGIN{sum=0} {sum += $5} END{print "txt file size is", sum}‘
txt file size is 328

统计GID=65534的行的个数:

[email protected]:~# awk -F: ‘BEGIN{count=0} {if($4==65534) count++} END{print count}‘ passwd.log
2
时间: 2024-10-17 08:35:37

Linux awk 命令的相关文章

Linux awk命令简单操作

AWK Command: 一 : print print item1,item2,.......... 要点: 1.各项目之间使用逗号隔开,而输入时则以空白字符分隔 2.输出的item可以为字符串或树枝,当前记录的字段(如$1).变来那个或awk的表达式,树枝会转换成字符串 3.print命令后面的item可以省略,此时其功能相当于print $0,以此,如果想输出空白行,则需要print "" 例子: 1.awk 'BEGIN { pring "line one\n lin

LINUX - awk命令之NF和$NF区别 (转)

NF和$NF 区别问答:(转)1.awk中$NF是什么意思?#pwd/usr/local/etc~# echo $PWD | awk -F/ '{print $NF}'etcNF代表:浏览记录的域的个数$NF代表:最后一个Field(列) 2.awk下面的变量NF和$NF有什么区别?{print NF} 也有{print $NF}前者是输出了域个数,后者是输出最后一个字段的内容如:~# echo $PWD | awk -F/ '{print $NF}' LINUX - awk命令之NF和$NF区

Linux awk 命令详解

简介linux awk命令详解 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理. awk有3个不同版本: awk.nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本. awk其名称得自于它的创始人 Alfred Aho .Peter Weinberger 和 Brian Kernighan 姓氏的

linux awk命令详解(都是常用命令)

原文:http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理. awk有3个不同版本: awk.nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本. awk其名称得自于它

linux awk命令分析http server访问日志

摘抄自http://www.ibm.com/developerworks/ AWK 简介 AWK 是一种"样式扫描和处理语言".它允许您创建简短的程序,这些程序读取输入文件.为数据排序.处理数据.对输入执行计算以及生成报表.它的名称取自于它的创始人 Alfred Aho. Peter Weinberger 和 Brian Kernighan 姓氏的首个字母. 本文论述的 awk 命令主要指 Linux 操作系统中广泛包含的内置程序 /bin/gawk,它是 Unix awk 程序的 G

Linux awk命令详解??????????(研究)

http://blog.chinaunix.net/uid-25120309-id-3801250.html 一.  AWK 说明  awk是一种编程语言,用于在linux/unix下对文本和数据进行处理.数据可以来自标准输入.一个或多个文件,或其它命令的输出.它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具.它在命令行中使用,但更多是作为脚本来使用. awk的处理文本和数据的方式:它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上

Linux awk命令

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理. awk工作流程是这样的:读入有'\n'换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域.默认域分隔符是"空白键" 或 "[tab]键" 示例:#cat /etc/passwd |awk 

Linux awk 命令 说明

一. AWK 说明 awk是一种编程语言,用于在linux/unix下对文本和数据进行处理.数据可以来自标准输入.一个或多个文件,或其它命令的输出.它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具.它在命令行中使用,但更多是作为脚本来使用. awk的处理文本和数据的方式:它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作.如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),如果没有指定模式,则所有被操作所指定的

linux awk命令详解2

awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息 awk处理过程: 依次对每一行进行处理,然后输出 awk命令形式: awk [-F|-f|-v] 'BEGIN{} //{command1; command2} END{}' file [-F|-f|-v]   大参数,-F指定分隔符,-f调用脚本,-v定义变量 var=value '  '          引用代码块 BEGIN   初始化代码块,在对每一行进行处理之前,初始

linux awk命令详解(转)

简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理. awk有3个不同版本: awk.nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本. awk其名称得自于它的创始人 Alfred Aho .Peter Weinberger 和 Brian Kernighan 姓氏的首个字母.实际上 AWK