linux下awk命令语法及使用实例教程

linux awk命令使用实例,awk是一种文本处理工具,在linux shell下尤为突出,

一个awk脚本通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块3部分组成,这三个部分是可选的。实例:

awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file

BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中。

END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。

pattern语句块中的通用命令是最重要的部分,它也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块。

比如有个test.txt文档,里面包含:

Frank
Testing 1
Hello World
TesT
123 Testing

一:awk '{ print }' test.txt
 
clvaluedqdqBook-Pro:~ clvaluedq$ awk '{ print }' test.txt
Frank
Testing 1
Hello World
TesT
123 Testing
 
二:awk正则表达式
 
clvaluedqdeBook-Pro:~ clvaluedq$ awk '/Test/ { print }' test.txt
Testing 1
123 Testing
 
三:awk '{ print $1 }' test.txt
 
clvaluedqdeBook-Pro:~ clvaluedq$ awk '{ print $1 }' test.txt
Frank
Testing
Hello
TesT
123

四:awk '{ print $2 }' test.txt
 
clvaluedqdeBook-Pro:~ clvaluedq$ awk '{ print $2 }' test.txt

World
 
Testing
 
五.awk '{ if($1 ~/123/)  print }' test.txt
 
clvaluedqdeBook-Pro:~ clvaluedq$ awk '{ if($1 ~/123/) print }' test.txt
123 Testing
 
六:grep -i test test.txt  | awk  '/[0-9]/{ print }'
 
clvaluedqdeBook-Pro:~ clvaluedq$ grep -i test test.txt | awk '/[0-9]/{ print }'
Testing 1
123 Testing
 
clvaluedqdeBook-Pro:~ clvaluedq$ grep -i test test.txt | awk '/^[0-9]/{ print }'#0-9开头
123 Testing

七:除此之外,awk还支持编程逻辑运算,比如数组循环
 
awk 'BEGIN{info="it is a test";tlen=split(info,tA," ");for(k=1;k<=tlen;k++){print k,tA[k];}}'
 
clvaluedqdqBook-Pro:~ clvaluedq$ awk 'BEGIN{info="it is a test";tlen=split(info,tA," ");for(k=1;k<=tlen;k++){print k,tA[k];}}'
1 it
2 is
3 a
4 test
 
八:设置处理字符串的函数 比如php的substr
 
awk 'BEGIN{info="this is a test2010test!";print substr(info,4,10);}'
 
clvaluedqdeBook-Pro:~ clvaluedq$ awk 'BEGIN{info="this is a test2010test!";print substr(info,4,10);}'
s is a tes

Linux awk 命令与实例

AWK介绍


1    调用awk

三种方式:
1.    命令行方式:    
awk [-F filed-separator] 'commands' input-files
-F    指定分隔符(默认是空格或tab)
commands    awk的命令
input-files    要处理的文件
2.    将所有awk命令插入一个文件,并使awk程序可执行,然后用awk命令解释器作为脚本的首行,以便通过键入脚本名称来调用它
3.    将所有的awk命令插入一个单独文件,然后调用:
awk -f awk-script-file input-files
-f    指明调用脚本名
input-files    待处理的文件

2    awk脚本
在命令中调用awk时,awk脚本由各种操作和模式组成。
awk每次读一条记录或一行,并使用指定的分隔符分隔指定域。当新行出现时,awk命令获悉已读完整条记录,然后在下一个记录启动读命令,这个读进程将持续到文件尾或文件不再存在。
2.1    模式和动作
任何awk语句都由模式和动作组成。模式部分决定动作语句何时触发及触发条件。处理即对数据进行的操作。如果省略模式部分,动作将时刻保持执行状态。
模式可以是任何条件语句、复合语句或正则表达式,包括两个特殊字段BEGIN和END。使用BEGIN语句设置计数和打印头。BEGIN语句用在任何文本浏览动作之前,之后文本浏览动作依据输入文件开始执行。END语句用在awk完成文本浏览动作后打印输出文本总数和结尾状态标志。如果不特别指明模式,awk总是匹配。
实际动作在大括号{}内指明。动作大多数用来打印,但还有些更长的代码诸如if和循环语句及循环退出结构。如果不指明采取动作,awk将打印出所有浏览出来的记录。
2.2    域和记录
awk执行时,其浏览域标记为$1,$2…$n,这种方法称为域标识。当需要指定多域时使用逗号,用于分隔,如$1,$3指定第一域和第三域,如果希望指定所有域可使用$0。
使用print命令执行打印操作,这是一个awk命令,需要用{}括起来。
1.    抽取域
举例: 现有一个grade.txt文件,内容如下:
$ cat grade.txt
M.Tansley        05/99    48311    Green    8    40    44
J.Lulu            06/99    48317    Green    9    24    26
P.Bunny        02/99    48        Yellow    12    35    28
J.Troll            07/99    4842    Brown-3    12    26    26
L.Tansley        05/99    4712    Brwon-2    12    30    28
此文本文件有7个域,以空格作为域分隔符
2.    保存awk输出
两种方式保存awk的输出结果:
重定向到文件:(屏幕无显示)
$ awk '{print $0}' grade.txt >wow
使用管道将输出结果传给tee:(屏幕显示结果)
$ awk '{print $0}' grade.txt|tee woww
3.    使用标准输入
几种方法:
$ belts.awk grade.txt
$ belts.awk < grade.txt
4.    打印所有记录
$ awk '{print $0}' grade.txt
5.    打印单独记录
只打印$1和$4:
$ awk '{print $1,$4}' grade.txt
6.    自定义格式打印
可以在$1和$4的上方添加注释,Name和Belt:
$ awk 'BEGIN {print "Name\t\tBelt\n-------------------------"} {print $1"\t"$4}' grade.txt
在结尾加上结束注释:
$ awk 'BEGIN {print "Name\t\tBelt\n-------------------------"} {print $1"\t"$4} END {print "-------------------------\nEnd of report"}' grade.txt
7.    awk错误信息提示
在碰到awk错误时,可相应查找:
•    确保整个awk命令用单引号括起来
•    确保命令内所有引号成对出现
•    确保用大括号{}括起动作语句,用括号()括起条件语句
•    可能忘记使用大括号{}
8.    awk键盘输入
如果没有给出输入文件,awk从键盘获得输入,完成后按结束输入
2.3    元字符
\ ^ $ . [ ] | ( ) * + ?
其中+和?只适用于awk而不适用于grep或sed:
+    匹配一个或一个以上前面的单字符
?    匹配0个或一个前面的单字符
举例:
/XY+Z/    匹配XYZ、XYYYYZ
/XY?Z/    匹配XYZ、XZ
2.4    条件操作符
操作符            描述
  <                小于
  <=              小于等于
  ==                等于
  !=               不等于
  >                大于
  >=              大于等于
  ~           匹配正则表达式
  !~          不匹配正则表达式
1.    匹配
使用~紧跟正则表达式可以匹配域,也可以用if,条件需要用()括起来
举例:
查询棕带学员的所有情况(打印出$4匹配Brown的行)
$ awk '{if ($4~/Brown/) print $0}' grade.txt

$ awk '$0 ~ /Brown/' grade.txt
2.    精确匹配
使用==并用双引号括起条件可以精确匹配条件
举例:
$ awk '{if ($3 == "48") print $0}' grade.txt
3.    不匹配
使用!~紧跟正则表达式不匹配域
举例:
查询不是棕带的所有学员情况(打印出$4不匹配Brown的行)
$ awk '{if ($4!~/Brown/) print $0}' grade.txt

$ awk '$0 !~ /Brown/' grade.txt
4.    比较
由于几个比较大小符的使用方法都一样,就随便举一个例子:
$ awk '{if ($6 < $7) print $1" try better at the next comp"}' grade.txt
5.    各种匹配
匹配Green或green:
$ awk '/[Gg]reen/' grade.txt
匹配$1的第四个字符是a:
$ awk '$1 ~ /^...a/' grade.txt
匹配Yellow或Brown:
$ awk '$4 ~ /Yellow|Brown/' grade.txt
匹配以J开头的行:
$ awk '$0 ~ /^J/' grade.txt
6.    复合表达式
复合模式或复合操作符用于形成复杂的逻辑操作,复合表达式即为模式间通过使用复合操作符互相结合起来的表达式
&&    AND:    符号两边必须同时为真
|| OR:    符号两边至少一边为真
! :    非 求逆
举例:
$ awk '{if ($1 == "P.Bunny" && $4 == "Yellow") print $0}' grade.txt
$ awk '{if ($4 == "Yellow" || $4 ~ /Brown/) print $0}' grade.txt
2.5    awk内置变量
awk有许多内置变量用来设置环境信息,常用的有:
ARGC        命令行参数个数
ARGV        命令行参数排列
ENVIRON        支持队列中系统环境变量的使用
FILENAME    awk读取的文件名
FNR            当前文件已处理的记录行数
FS            设置域分隔符,相当于-F
NF            域的列数
NR            已处理的记录总行数
OFS            设置输出字段域分隔符
RS/ORS        换行符

ARGC支持命令行中传入awk脚本的参数个数。ARGV是ARGC的参数排列数组,其中每一元素表示为ARGV[n],n为希望访问的命令行参数
ENVIRON支持系统设置的环境变量,要访问单独变量,使用实际变量名,如ENVIRON[“EDITOR”]=”Vi”
FILENAME为awk脚本当前操作文件的文件名
FNR为awk当前操作文件的记录行数,其值总是小于等于NR。如果脚本正在访问多个文件,每一新输入文件都将重置此变量
FS用来设置域分隔符,与命令行中-F相同,缺省为空格。如: 以冒号为分隔符FS=":"
NF为记录域个数(列数),在记录被读之后设置,常用$NF指定最后一列
OFS指定输出记录的域分隔符,缺省为空格。如: 以-为分隔符输出FS="-"
ORS与RS都为输出记录分隔符,缺省是新行(\n)
举例:
查看文件的记录数:
$ awk 'END {print NR}' grade.txt
打印所有记录及记录的行号及总域数,并在最后打印出读取文件的文件名:
$ awk '{print NF,NR,$0} END {print FILENAME}' grade.txt
至少包含一个记录且包含Brown:
$ awk '{if (NR > 0 && $4 ~ /Brown/) print $0}' grade.txt
NF的一个强大功能是将变量$PWD的返回值传入awk并显示其目录:
$ echo $PWD | awk -F/ '{print $NF}'
显示文件名:
$ echo "/usr/apache/conf/httpd.conf" | awk -F/ '{print $NF}'
2.6    awk操作符
awk操作符的基本表达式可以划分为数字型、字符串型、变量型域及数组元素
= += -= *= /= %= ^=            赋值操作符
?                        条件表达操作符
|| && !                    并、与、非
~ !~                        匹配操作符(匹配与不匹配)
< <= == != > >=                关系操作符
+ - * / % ^                算术操作符
++ --                        前缀和后缀
1.    设置输入域到域变量名
在awk中,设置有意义的域名是一种好习惯,在进行模式匹配或关系操作时更容易理解。一般的变量名设置方式为name=$n,这里name为调用的域变量名,n为实际域号。多个域名设置之间用分号;分隔(请注意下面;的使用)
$ awk '{name = $1;belts = $4; if (belts ~ /Yellow/) print name" is belt "belts}' grade.txt
2.    域值比较操作
有两种方式测试一数值域是否小于另一数值域:
1)    在BEGIN中给变量名赋值
2)    在关系操作符中使用实际数值
通常在BEGIN部分赋值是很有益的,可以在awk表达式进行改动时减少很多麻烦。使用关系操作时必须用圆括号括起来。举例:
查询所有比赛中得分在27点一下的学生:
$ awk '{if ($6 < 27) print $0}' grade.txt

$ awk 'BEGIN {BASELINE = "27"} {if ($6 < BASELINE) print $0}' grade.txt
3.    修改数值域取值
当在awk中修改任何域时,重要的一点是要记住实际输入文件是不可修改的,修改的只是保存在缓存里的awk复本。awk会在变量NR或NF中反映出修改痕迹
为修改数值域,简单的给域标识重赋新值。举例:
$ awk '{if ($1 == "M.Tansley") $6 = $6 - 1; print $1,$6,$7}' grade.txt
4.    修改文本域
修改文本域即对其重新赋值,赋给一个新的字符串。记住,字符串要使用双引号,并用圆括号括起整个语法。举例:
$ awk '{if ($1 == "J.Troll") ($1 = "J.L.Troll"); print $1}' grade.txt
5.    只显示修改记录
如果文件很大,修改的记录很多,所以需要只查看修改部分。在模式后面使用大括号{}将只打印修改部分。取得模式,再根据模式结果实施操作。举例:(注意大括号的位置)
$ awk '{if ($1 == "J.Troll") {$1 = "J.L.Troll"; print $1}}' grade.txt
6.    创建新的输出域
在awk中处理数据时,基于各域进行计算时创建新域是一种好习惯。创建新域要通过其他域赋予新域标识符。举例:
在grade.txt中创建新域8保存域目前级别分与域最高级别分的差值:
$ awk 'BEGIN {print "Name\tDifference"} {if ($6 < $7) {$8 = $7 - $6; print $1,$8}}' grade.txt
或者赋予便于理解的变量名:
$ awk 'BEGIN {print "Name\tDifference"} {if ($6 < $7) {diff = $7 - $6; print $1,diff}}' grade.txt
7.    增加列值
使用符号+=增加列数或进行运行结果统计。将符号右边的变量域的值赋给左边。
举例:
打印出所有学生的总成绩(将整个文件的$6求和,total为变量名):
$ awk '(total += $6); END {print "Club student total points: "total}' grade.txt
如果文件很大,只想打印结果部分而不是所有记录,在语句的外面加上大括号{}即可:
$ awk '{(total += $6)}; END {print "Club student total points: "total}' grade.txt
查看当前目录所有文件大小及总和(除去子目录):
$ ls -l|awk '/^[^d]/ {print $9"\t"$5} {total += $5} END {print "total Bytes: "total}'
2.9    内置的字符串函数
awk有很多强大的字符串函数:
gsub(r,s,t)                在整个字符串t中用字符串s替代所有满足正则表达式r的字符串(如没指定t则默认为$0)
index(s,t)                返回字符串s中字符串t第一次出现的位置(如不存在则为0)
length(s)                返回s字符串的长度(如没指定s则默认为$0)
match(s,r)            返回第一个满足正则表达式r的字符串在s字符串里面的位置(如无匹配的则为0)
split(s,a,sep)            使用sep将字符串s分隔成为数组a的元素,返回数组元素的数量(如果没指定分隔符则默认与FS相同用法)
sprint("fmt",exp)        使用printf的格式说明对表达式exp 进行格式化输出
sub(r,s,t)                在字符串t中用s字符串替换满足正则表达式r的第一个字符串,返回1如果成功,否则返回0(如没指定t则默认为$0)
substr(s,p,n)            返回字符串s中以p位置开始长度为n的字符串(如果没指定n则返回从p位置开始的所有字符串)
tolower(s)            将字符串s中的所有大写字母转换为小写,返回转换后的字符串
toupper(s)            将字符串s中的所有小写字母转换为大写,返回转换后的字符串
1.    gsub(r,s,t)
在整个字符串t中用字符串s替代所有满足正则表达式r的字符串(如没指定t则默认为$0):
$ awk 'gsub(/4842/,4899) {print $0}' grade.txt

$ awk '{if (gsub(/4842/,4899)) print $0}' grade.txt
2.    index(s,t)
返回字符串s中字符串t第一次出现的位置(如不存在则为0)。必须用双引号将字符串都括起来:
$ awk 'BEGIN {print index("Benny","ny")}' grade.txt
3.    length(s)
返回s字符串的长度(如没指定s则默认为$0):
$ awk '$1 == "J.Troll" {print length($1)" "$1}' grade.txt
$ awk 'BEGIN {print length("Kevin is a good boy.")}'
4.    match(s,r)
返回第一个满足正则表达式r的字符串在s字符串里面的位置:
$ awk 'BEGIN {print match("ANCD",/d/)}'(返回0)
$ awk '$1=="J.Lulu" {print match($1,/u/)}' grade.txt(返回第一个u在J.Lulu里的位置: 3)
5.    split(s,a,sep)
使用sep将字符串s分隔成为数组a的元素,返回数组元素的数量:
$ awk 'BEGIN {print split("123#456#789",array,"#")}'
返回3,数组array的元素分别为:
array[1]="123"
array[2]="456"
array[3]="789"
6.    sub(r,s,t)
在字符串t中用s字符串替换满足正则表达式r的第一个字符串,返回1如果成功,否则返回0(如没指定t则默认为$0):
$ awk '$1 == "J.Troll" {if (sub(/26/,"29")) print}' grade.txt
7.    substr(s,p,n)
返回字符串s中以p位置开始长度为n的字符串(如果没指定n则返回从p位置开始的所有字符串):
$ awk '$1 == "L.Tansley" {print substr($1,1,5)}' grade.txt(返回L.Tan)
如果给定长度值n大于字符串长度,则awk将从起始位置返回所有字符:
$ awk '$1 == "L.Tansley" {print substr($1,3,15)}' grade.txt(返回Tansley)
如果没指定n,则awk将从起始位置返回所有字符:
$ awk '{print substr($1,3)}' grade.txt
在BEGIN部分定义字符串,在END部分返回抽取的字符:
$ awk 'BEGIN {STR="Kevin is a good boy."} END {print substr(STR,12,8)}' grade.txt
8.    从shell中向awk传入字符串
$ echo "Stand-by"|awk '{print length($0)}'
设置文件名为一变量,取文件名:
$ STR="grade.txt"
$ echo $STR|awk '{print substr($STR,1,5)}'
取文件名后缀:
$ STR="grade.txt"
$ echo $STR|awk '{print substr($STR,7) }'
2.10    awk输出函数printf
awk提供函数printf,拥有几种不同的格式化输出功能。每一种printf函数(控制格式字符)都以一个%符号开始,以一个决定转换的字符结束。转换包含三种修饰符。
语法:
printf "格式控制符",参数

awk printf修饰符
-        左对齐
Width    域的步长,用0表示0步长
.prec    最大字符串长度,或小数点右边的位数

awk printf格式
%c        ASCII字符
%d        整数
%e        浮点数(科学记数法)
%f        浮点数
%g        awk决定使用哪种浮点数转换(e或者f)
%o        八进制数
%s        字符串
%x        十六进制数
举例:
字符转换:
$ awk 'BEGIN {printf "%c\n",65}' grade.txt
格式化输出:
打印所有的学生名字和序列号,要求名字左对齐,15个字符长度,后跟序列号:
$ awk '{printf "%-15s %s\n",$1,$3}' grade.txt
再加入注释:
$ awk 'BEGIN {print "Name\t\tNumber"} {printf "%-15s %s\n",$1,$3}' grade.txt
2.11    向一行awk命令传值
在awk执行前将值传入awk变量,需要将变量放在命令行下,格式:
awk 命令变量=输入文件值
举例:
$ awk '{if ($5 < AGE) print $0}' AGE=10 grade.txt
查询可用空间小于36000M的分区:
$ df -m|awk '($4 ~ /^[0-9]/) {if ($4 < LIMIT) print $6"\t"$4}' LIMIT=36000
awk也允许传入环境变量。举例:
查询当前用户登陆在哪个端口:
$ who|awk '{if ($1 == user) print $1" you are connected to "$2}' user=$LOGNAME
2.12    awk脚本文件
可以将awk脚本写入一个文件再执行它。使用awk脚本的好处是不比每次使用时都需要重新输入,并且可以增加注释便于理解。拿一个awk脚本举例:
#!/bin/awk -f
# all comment lines must start with a hash '#'
# name: student_total.awk
# to call: student_total.awk grade.txt
# prints total and average of club student points

# print a header first
BEGIN{
print "Student\t\tDate\tNumber\tGrade\tAge\tPoints\tMax"
print "Name\t\tJoined\t\t\t\tGained\tPoint Available"
print "========================================================================"
}

# let's add the scores of points gained
(total += $6)

# finished processing now let's print the total and average point
END {
print "Club Student Total points: " total
print "Average Club Student points: " total/NR
}
第一行是#!/bin/awk -f,这一行很重要,没有它脚本将不能执行,因为它告知脚本系统中awk的位置。通过将命令分开,脚本的可读性提高,还可以在命令之间加入注释。
执行时在脚本文件后键入文件名,但需要先赋予可执行权限。
2.13    在awk中使用FS变量
使用awk脚本时,设置FS变量是在BEGIN部分。如果不这样,awk不知道域分隔符是什么。
脚本举例:(该脚本从/etc/passwd中抽取第一和第五域)
#!/bin/awk -f
# to call: passwd.awk /etc/passwd
# print out the first and fifth fields
BEGIN {
FS=":"}
{print $1,"\t",$5}

2.14    向awk脚本传值
向awk脚本传值与向awk命令行传值方式大体相同,格式:
awk_script var=value input_file
举例:
#!/bin/awk -f
# name: age.awk
# to call: age.awk AGE=n grade.txt
# prints ages that are lower than the age supplied on the command line
{if ($5 < AGE)
print $0}
执行方式:(别忘了先赋予可执行权限)
$ ./age.awk AGE=10 grade.txt
也可以使用管道命令将命令的结果传递给awk脚本,如
$ cat grade.txt |./ student_total.awk
2.15    awk数组
数组使用前不必定义,也不必指定数组元素个数。经常使用循环来访问数组,下面是一种循环类型的基本结构:
for (element in array) print array[element]
举例:(前面提到过的字符串123#456#789)
#!/bin/awk -f
# name: arraytest.awk
# prints out an array
BEGIN {
record="123#456#789";
split(record,array,"#")
}
END {
for (i in array) {
print array[i]
}
}
使用/dev/null作为输入运行脚本:
$ ./arraytest.awk /dev/null

从指定文本里找出匹配条件的项及其出现的次数
#!/bin/awk -f
# name: count.awk
# to call: count.awk grade2.txt
# loops through the grade2.txt file and counts how many belts we have in(yellow, orange, red)
# also count how many adults and juniors we have
# start of BEGIN
# set FS and load the arrays with our values
BEGIN {FS="#"
# load the belt colours we are interested in only
belt["Yellow"]
belt["Orange"]
belt["Red"]
# end of BEGIN
# load the student type
student["Junior"]
student["Senior"]
}
# loop thru array that holds the belt colours against field-1
# if we have a match, keep a running total
{for (colour in belt)
  {if ($1 == colour)
  belt[colour]++}}
# loop thru array that holds the student type against
# field-2 if we have a match, keep a running total
{for (senior_or_junior in student)
  {if ($2 == senior_or_junior)
  student[senior_or_junior]++}}

# finished processing so print out the matches..for each array
END {for (colour in belt) print "The club has", belt[colour], colour, "Belts"

for (senior_or_junior in student) print "The club has", student[senior_or_junior], senior_or_junior, "students"}
BEGIN部分设置域分隔符为#,初始化两个数组的内容元素。然后处理文件,先给数组命名为colour,使用循环语句比对$1是否等于数组元素之一(Yellow、Orange或Red),如果匹配,依照匹配元素将运行总数保存进数组。同样的方法处理数组senior_or_junior。END部分打印浏览结果,对每一个数组使用循环语句并打印

收集awk的一些技巧方案
awk [opion] 'awk_script' input_file1 [input_file2 ...] awk的常用选项option有:
① -F fs : 使用fs作为输入记录的字段分隔符,如果省略该选项,wak使用环境变量IFS的值。
② -f filename : 从文件filename中读取awk_script。
③ -v var=value : 为awk_script设置变量。
1、删除重复的行
#awk '!a[]++'

2、将数据文件中的每个词的第一个字母变成大写
dingyi@backup:~$ cat test
linux is long live!!!
i am a cuer

dingyi@backup:~$ awk ',1,1); sub(/^./,toupper(first),); print }' test
Linux is long live!!!
I am a cuer

awk 请教

下面是文件一,文件二
  $cat file1
00001       20
00002       31
00003       04
00004       56
00005       94
00006       73
00007       25
00008       86
00009       19
00010       52
$cat file2
00001       20
00007       28
00002       32
00004       56
00010       52
怎样的shell才能使file1、file2两个文件的$2不同的话,取出全局$0?
注意:比较两个文件的$2的时候,一定要第一列相同的情况下才比较
请大虾执教
li2002 2003-9-11 08:57
 
awk 请教

不就是找出不同行吗?
cat file1 file2|sort |uniq -u
deathcult 2003-9-11 09:15
 
awk 请教
paste file1 file2|awk '{if(($1==$3)&&($2!=$4))print$0}'
bjgirl 2003-9-11 09:38
 
awk 请教
[code]
#!/bin/ksh
sort -n file1>nf
sort -n file2>mf
paste nf mf|awk '$1=$3 {print}'|awk '$2!=$4 {print}'
rm nf mf
结果:
00002 31 00002 32
00004 04 00004 56
00007 56 00007 28
00010 94 00010 52
[/code]
killua 2003-9-11 10:05
 
awk 请教
回一楼,最近在学awk啦,而且你那样得到的数值是
00002 31
00002 32
00003 04
00005 94
00006 73
00007 25
00007 28
00008 86
00009 19
00010 52
00010 52
而我要的是
00002 31  32
00007 25  28
 
 

二楼的没有数值哦,而且应该是paste file1 file2|awk '{if ($1 == $3 && $2 != $4) print $0}'[/quote]

awk 请教
三楼的答案是错的,我要是结果是
[color=red]00002 31 32
00007 25 28
[/color]
把$1相同,而$2不同的列出来
admirer 2003-9-12 00:45
 
awk 请教
这不是一个简单的paste能解决的问题,而是一个以关键字连接的问题!
[code]sort file1 >f1;sort file2 >f2; join -j1 1 f1 f2|awk '$2 != $3'
00002 31 32
00007 25 28[/code]
killua 2003-9-12 03:30

 
awk 请教
[quote][i]原帖由 "yoof"]join -j1 1 f1 f2  请版主解释[/quote 发表:[/i]
以第一个文件的第一个域为索引键,连接f1,f2两个文件

文件处理

1.有文件gz.txt(工资)

4367422926350133100 张三 1250.00

4367422926351220178 李四 1300.00

4367422926351220546 王二 0

苏五丙 1340.00

4367422926351220178 孙六月 1390.00

…… ……

要求:按账号19位、姓名8位、工资8位来排列,且如姓名不足8位在之后补足,工资不足8位则在工资之前补。同时要求去掉工资为0的名单,没有账号在前补19位空格,并输出工资总数加以核对,处理后应如下排列:

4367422926350133100张三 1250.00

4367422926351220178李四 1300.00

苏五丙 1340.00

4367422926351220178孙六月 1390.00

…… ……

awk程序:

#------------------------------------

#shgz1.sh

sblank=" "

awk '$nf!="0"' $1 > tmp.txt #删除工资为0的人数

awk '<

if($1!~/[0-9]/)<

printf("%-19.19s%-8.8s%8.2f\n","'"$kk"'",$1,$2)> #如果没有账号补上空格

else<

printf("%-19.19s%-8.8s%8.2f\n",$1,$2,$3)>

>' tmp.txt > $2

awk '$nf~/[0-9]/<

sum=sum+$nf

>

end<

system("rm tmp.txt")

printf("the sum is%16.2f!\n", sum) #输出工资总数

>' $2

在awk中调用系统变量必须用单引号,如果是双引号,则表示字符串
Flag=abcd
awk '{print '$Flag'}' 结果为abcd
awk '{print "$Flag"}' 结果为$Flag
如何删除匹配之间的内容但不包括匹配行
 
我有这样一个文件:
Query=4567879
    sequence jkaskdjgkjasgasa;jghsafgkas
    jfaklslgjdla;;gsdakl;gd

score     E
PUT-ASD-WEETED-001
PUT-ASD-WEQER5-001789
>PUT-ASD-WEETED-001
SDAGDSDS
>PUT-ASD-WEQER5-001789
DSGTSDTEW
.....
......
......
是这样的,我想删除
从score     E
到以第一个以>开头的中间所有的行,但不包括score     E行和第一以>开头的行

sed '/score     E/,/^>/d' urfile
肯定是不行的,把score     E行和第一以>开头的行也删掉了?
该怎么写呢?
其中要处理的文件中含有多个score     E和第一以>开头的之间的行,均删掉。
 
 
awk -v p=1 '/score/{p=0}/>/{p=1}p' urfile

时间: 2024-09-19 20:39:49

linux下awk命令语法及使用实例教程的相关文章

Linux下Nginx配置虚拟主机VirtualHost实例教程

增加 Nginx 虚拟主机 这里假设大家的 Nginx 服务器已经安装好, 不懂的请阅读各 linux 发行版的官方文档或者 LNMP 的安装说明. 配置 Virtual host 步骤如下: 进入 /usr/local/nginx/conf/vhost 目录, 创建虚拟主机配置文件 demo.neoease.com.conf ({域名}.conf). 打开配置文件, 添加服务如下:    代码如下 复制代码 server {     listen          80;           

Linux下find命令实例

Linux下find命令实例 $find ~ -name "*.txt" -print #在$HOME中查.txt文件并显示 $find . -name "*.txt" -print $find . -name "[A-Z]*" -pri26nbsp; #对匹配的文件使用cpio命令,将他们备份到 磁带设备中-prune #忽略某个目录 $find . -name "[A-Z]*" -print #查以大写字母开头的文件 $f

Linux 下 Make 命令实例详解

  Linux 下 Make 命令实例详解          Linux 下 make 命令是系统管理员和程序员用的最频繁的命令之一.管理员用它通过命令行来编译和安装很多开源的工具,程序员用它来管理他们大型复杂的项目编译问题.本文我们将用一些实例来讨论 make 命令背后的工作机制. Make 如何工作的 对于不知道背后机理的人来说,make 命令像命令行参数一样接收目标.这些目标通常存放在以 "Makefile" 来命名的特殊文件中,同时文件也包含与目标相对应的操作.更多信息,阅读关

Linux 下 SSH 命令实例指南

Linux 下 SSH 命令实例指南 如果你已经在IT圈内混久了, 应该对 SSH 这个了不起的工具及其安全特性有所耳闻吧. 本教程可以让你在短时间内掌握通过 SSH 安全便利地连接到远程计算机的技术. 如果你对 SSH 还没什么概念, 可以先访问 维基百科 进行了解. 基本用法 最简单的 SSH 命令只需要指定用户名和主机名参数即可. 主机名可以是 IP 地址或者域名. 命令格式如下: $ ssh user@hostname 比如要在我的局域网内登录一个树莓派系统, 只需要简单的在命令行输入如

Linux系统下df命令的11个实例分享

df 即"可用磁盘"disk free,用于显示文件系统的磁盘使用情况.默认情况下,df 命令将以每块 1K 的单位进行显示所有当前已挂载的文件系统,如果你想以人类易读的格式显示 df 命令的输出,像这样"df -h"使用 -h 选项.在这篇文章中,我们将讨论 df 命令在 Linux 下11种不同的实例. 在 Linux 下 df 命令的基本格式为: # df {options} {mount_point_of_filesystem} 在 df 命令中可用的选项有

Linux下ps命令的10个基本例子

  在Linux下ps命令是用于查看系统上运行的进程的最基本的命令之一.它提供了当前进程的同时,如用户ID,CPU使用率,内存使用率,命令名称等,它不显示实时数据,如top或htop命令的详细信息.但是,即使是功能和输出简单,但它仍然是一个必用的过程管理/监控工具,每一个Linux新手应该知道这一点,好好学习.在这篇文章中,我们将使用ps命令以不同的方式来查看进程.筛选和排序它们,以加强基础部分. 语法注意: ps命令带有2种不一样的风格,分别是BSD和UNIX.新用户经常会混淆和错误地解释这两

Linux下nl命令的用法详解

Linux中nl命令和cat命令很像,不过nl命令会打上行号,属于比较不常用的命令,下面随小编一起来了解下这个鲜为人知的nl命令吧. nl命令在linux系统中用来计算文件中行号.nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等等的功能. 1.命令格式: nl [选项]... [文件]... 2.命令参数: -b :指定行号指定的方式,主要有两种: -b a :表示不论是否为空行,也同样列出

理解Linux下Shell 命令的不同分类及它们的用法

当你打算真正操纵好你的 Linux 系统,没有什么能比命令行界面更让你做到这一点.为了成为一个 Linux 高手,你必须能够理解 Shell 命令的不同类型,并且会在终端下正确的使用它们. 在 Linux 下,命令有几种类型,对于一个 Linux 新手来说,知道不同命令的意思才能够高效和准确的使用它们.因此,在这篇文章里,我们将会遍及各种不同分类的 Linux Shell 命令. 需要注意一件非常重要的事:命令行界面和 Shell 是不同的,命令行界面只是为你提供一个访问 Shell 的方式.而

Linux下chkconfig命令详解(转)

Linux下chkconfig命令详解 chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 使用语法:chkconfig [--add][--del][--list][系统服务] 或 chkconfig [--level <等级代号>][系统服务][on/off/reset] chkconfig在没有参数运行时,显示用法.如果加上服务名,那么就检查这个服务是否在当前运行级启动.如果是,返