linux awk命令
awk命令是Alfred Aho, Peter Weinberger, Brian Kernighan三位作者联合开发的,用于Linux/Unix中处理数据和产生报告。awk命令功能十分强大,可根据需要抓取、截取指定的列或行。
首先在/mnt目录下创建示例文本文件f1,其内容如下:
1 hello hello
2 data data
3 xyz abc
4 123 789
5 ftp
6 Apache
7 apache
然后,使用awk对f1文件内容进行处理,举例如下。
①awk -F " " '{print $2,$3}' f1:截取显示文档的第二列和第三列,-F指定分隔符为空格,$表示显示第几列。其中print表示要做输出信息的动作,$2和$3表示要输出的列号,awk要求将print已经输出列等内容放在“'{}'”之间。
②awk -F " " '($1>3){print $2,$3}' f1:选取第一列的值大于3的行,显示其第二列和第三列,在“()”中指定筛选条件。
③awk 'NR==4 || NR==3' f1:显示第三行和第四行,NR表示行号。
④awk '/data/ {print $2}' f1:抓取包含指定字符的行,再对列进行截取。此例中,awk先按照“data”字符串对文件f1中的行筛选,找出包含“data”的行以后,再按照默认的空格作为分隔符对行的内容做切割,仅打印出第二列的内容。
⑤awk '$2 ~ /data/ ' f1:抓取第二列包含指定字符的行。其中“~”表示是否匹配指定的“data”,如果第二列的内容包含“data”就打印出整行内容。
⑥awk '$2 !~ /data/ ' f1:抓取第二列不包含指定字符的行。其中“!~”表示是否不匹配指定的“data”,如果第二列的内容不包含“data”就打印出整行内容。
非常强大的文本操纵工具,sed,awk,grep 这个三个命令 都是操作文本文件的
unix系统有几个非常命令的特点:
1. 对于内核而言,unix文件都是字节序列。io设备也是文件。
2. 至于文件的含义交由应用程序来解释。其中文本文件非常重要,因为unix提供 很多了实用程序(utility),这些程序功能相对独立,但可以通过管道来实现进程间通信(IPC),这样松散的耦合可以完成复杂的操作。那么进程间的通信的数据格式是怎样的呢? 其实对于实用程序而言,这个数据格式就是简单的文本文件。此外,还有IO重定向,也是一个不错的创意。至于文本文件中的内容采用什么格式呢?这个很具体的命令有关,那么操作文本就变得非常重要。grep,sed和awk就是三个操纵文本文件的命令
grep搜索
sed 修改和编辑文本文件中某些行
awk 是访问文本文件,操纵文本文件中某些数据
明白了吗?
一、awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
二. awk命令格式和选项
2.1 awk的语法有两种形式
1. 命令行方式
awk [-F field-separator] 'commands' input-file(s)
其中,commands是真正awk命令,[-F域分隔符]是可选的。input-file(s)是待处理的文件。
在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。
2. 将所有的awk命令插入一个单独文件,然后调用:
awk -f awk-script-file input-file(s)
其中,-f选项加载awk-script-file中的awk脚本,input-file(s)跟上面的是一样的。
2.2 命令选项
(1)-F fs or --field-separator fs :指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。
(2)-v var=value or --asign var=value :赋值一个用户定义变量。
(3)-f scripfile or --file scriptfile :从脚本文件中读取awk命令。
(4)-mf nnn and -mr nnn :对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。
(5)-W compact or --compat, -W traditional or --traditional :在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。
(6)-W copyleft or --copyleft, -W copyright or --copyright :打印简短的版权信息。
(7)-W help or --help, -W usage or --usage :打印全部awk选项和每个选项的简短说明。
(8)-W lint or --lint :打印不能向传统unix平台移植的结构的警告。
(9)-W lint-old or --lint-old :打印关于不能向传统unix平台移植的结构的警告。
(10)-W posix :打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符**和**=不能代替^和^=;fflush无效。
(11)-W re-interval or --re-inerval :允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。
(12)-W source program-text or --source program-text :使用program-text作为源代码,可与-f命令混用。
(13)-W version or --version :打印bug报告信息的版本。
三. 使用方法
#awk '{pattern + action}' {filenames}
尽管操作可能会很复杂,但语法总是这样,其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。
awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。
通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。
四. 模式和操作
awk脚本是由模式和操作组成的:
pattern {action} 如$ awk '/root/' test,或$ awk '$3 < 100' test。
两者是可选的,如果没有模式,则action应用到全部记录,如果没有action,则输出匹配全部记录。默认情况下,每一个输入行都是一条记录,但用户可通过RS变量指定不同的分隔符进行分隔。
4.1. 模式
模式可以是以下任意一个:
(1)正则表达式:使用通配符的扩展集。
(2)关系表达式:可以用下面运算符表中的关系运算符进行操作,可以是字符(3)串或数字的比较,如$2>%1选择第二个字段比第一个字段长的行。
(4)模式匹配表达式:用运算符~(匹配)和~!(不匹配)。
(5)模式,模式:指定一个行的范围。该语法不能包括BEGIN和END模式。
(6)BEGIN:让用户指定在第一条输入记录被处理之前所发生的动作,通常可在这里设置全局变量。
(7)END:让用户在最后一条输入记录被读取之后发生的动作。
4.2. 操作
操作由一人或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内。主要有四部份:
(1)变量或数组赋值
(2)输出命令
(3)内置函数
(4)控制流命令
五. awk的环境变量
六. awk运算符
七. 记录和域
7.1. 记录
awk把每一个以换行符结束的行称为一个记录。
记录分隔符:默认的输入和输出的分隔符都是回车,保存在内建变量ORS和RS中。
$0变量:它指的是整条记录。如$ awk '{print $0}' test将输出test文件中的所有记录。
变量NR:一个计数器,每处理完一条记录,NR的值就增加1。
如$ awk '{print NR,$0}' test将输出test文件中所有记录,并在记录前显示记录号。
7.2. 域
记录中每个单词称做“域”,默认情况下以空格或tab分隔。awk可跟踪域的个数,并在内建变量NF中保存该值。如$ awk '{print $1,$3}' test将打印test文件中第一和第三个以空格分开的列(域)。
7.3. 域分隔符
内建变量FS保存输入域分隔符的值,默认是空格或tab。我们可以通过-F命令行选项修改FS的值。如$ awk -F: '{print $1,$5}' test将打印以冒号为分隔符的第一,第五列的内容。
可以同时使用多个域分隔符,这时应该把分隔符写成放到方括号中,如$awk -F'[:/t]' '{print $1,$3}' test,表示以空格、冒号和tab作为分隔符。
输出域的分隔符默认是一个空格,保存在OFS中。如$ awk -F: '{print $1,$5}' test,$1和$5间的逗号就是OFS的值。
八. 匹配操作符(~)
用来在记录或者域内匹配正则表达式。如$ awk '$1 ~/^root/' test将显示test文件第一列中以root开头的行。
九. 比较表达式
conditional expression1 ? expression2: expression3,
例如:
$ awk '{max = {$1 > $3} ? $1: $3: print max}' test。如果第一个域大于第三个域,$1就赋值给max,否则$3就赋值给max。
$ awk '$1 + $2 < 100' test。如果第一和第二个域相加大于100,则打印这些行。
$ awk '$1 > 5 && $2 < 10' test,如果第一个域大于5,并且第二个域小于10,则打印这些行。
十. 范围模板
范围模板匹配从第一个模板的第一次出现到第二个模板的第一次出现之间所有行。如果有一个模板没出现,则匹配到开头或末尾。如$ awk '/root/,/mysql/' test将显示root第一次出现到mysql第一次出现之间的所有行。
-F选项指定分隔符,你用的是'a',所以对于第一行abcabcabcabc
a分割后分成以下几个域:空 | bc | bc | bc | bc
对应关系为 :$1 $2 $3 $4 $5
print $3打印第三个域:bc
print $2打印第二个域:bc
print $1打印第一个域:空
第二行:vivi,abc,abc,abc
分割后:vivi, | bc, | bc, | bc
对应为:$1 $2 $3 $4
打印第三个域:bc,
打印第二个域:bc,
打印第一个域:vivi,
第三行:12345a,a---a;a
分割后:12345 | , | --- | ; | 空
对应为: $1 $2 $3 $4 $5
打印第三个域:---
打印第二个域:,
打印第一个域:12345
智祁丹参: awk:用于一行中分成数个“字段”来处理.适合处理 小型数据.运行模式:awk '条件类型1{动作1} 条件类型2{动作2} ...' filename# last | awk '{print $1 "\t" $3}' <== 查看登录者的数据,只显示登录名和ip地址,并以[tab]隔开 awk 的内置变量 变...
永泰县18035446167: linux中的awk用法 - ?
智祁丹参: 单引号会使得引号内的字符为字符本身,用' ';或者不要-F选项,因为默认是以空格为分隔符的.
永泰县18035446167: 如何在Linux中使用awk命令 - ?
智祁丹参: awk实例 1、cat /etc/passwd|awk -F: '{print $1}' 2、linux的awk一般都是gawk,/bin/awk -> gawk 3、awk '/abc/' file.txt 显示文件中包含abc行.类似grep abc a.txt 4、awk '{print NR,NF,$1,$NF,}' file.txt按空格分隔列,显示当前记录号、域数和每...
永泰县18035446167: linux 怎么用awk命令 取出一段文字 - ?
智祁丹参: awk '//,// {print $0}' filename
永泰县18035446167: linux里awk是做什么的,请详细说明 - ?
智祁丹参: awk语言的最基本功能是在文件或字符串中基于指定规则来分解抽取信息,也可以基于指定的规则来输出数据.完整的awk脚本通常用来格式化文本文件中的信息.你比如:echo "11|22|33" | awk -F "|" '{print $2}'
永泰县18035446167: linux awk命令 - ?
智祁丹参: -F选项指定分隔符,你用的是'a',所以对于第一行abcabcabcabc a分割后分成以下几个域:空 | bc | bc | bc | bc 对应关系为 :$1 $2 $3 $4 $5 print $3打印第三个域:bc print $2打印第二个域:bc print $1打印第一个域:空第二行:vivi,abc,abc,...
永泰县18035446167: linux awk命令基础 怎么在终端写 - ?
智祁丹参: awk一般用于文本处理,通常用作数据提取.终端书写demo awk '{print }' info.txt以上是输出文本文件info.txt的所有内容,请使用实际文件进行替换info.txt ps -ef|grep process_name | awk -F"" '{print $2}'以上是查找process_name进程的ID信息,把查找信息作为参数传给awk进行过滤,请使用实际进程名替换process_name.
永泰县18035446167: linux命令sed与awk是干什么用的,怎么用? - ?
智祁丹参: 非常强大的文本操纵工具,sed,awk,grep 这个三个命令 都是操作文本文件的 unix系统有几个非常命令的特点: 1. 对于内核而言,unix文件都是字节序列.io设备也是文件. 2. 至于文件的含义交由应用程序来解释.其中文本文件非常重要,因为...
永泰县18035446167: 懂linux 下 awk的请进,请解释语句.(初学) - ?
智祁丹参: awk 'BEGIN{total = 0;len = 0} {if($1~/^[0-9]+\.[0-9]*/){total += $1; len++}} END{print total/len}' a'BEGIN{total = 0;len = 0}' #这是在定义2个变量 if($1~/^[0-9]+\.[0-9]*/) #$1为第一列的意思(默认以空格区分) 这意思是如果第一列都为数字 total += $1; len...
永泰县18035446167: linux获得选中字符 - ?
智祁丹参: 直接用linux 自己带的 awk 命令取你所需的字符串就行了.我以前做一个监测linux的软件,就用awk截取类似free、iostat、oracle表空间的值,再读到我的小软件上来.另外,人家楼上说的貌似和(什么玩意?你就用点post android来迷惑我?貌似这话太刺激人了吧)安卓没有关系吧,他回答的是假如你linux启动是字符界面,如装有桌面系统就用,startx进入桌面.