awk工具

简介:

awk和sed一样是流式编辑器,它也是针对文档中的行来操作的,一行一行的去执行

head -n2 test.txt|awk -F ':' '{print $1}'  //截取文档的第一段

 head -n2 test.txt|awk -F ':' '{print $0}' //截取文档前两行

awk '{print $0}' test.txt //不指定分隔符默认使用空格或者tab空白字符

awk -F ':' '{print $1,$2,$3}' test.txt  //分别截取第一、第二、第三段

 awk -F ':' '{print $1"#"$2"#"$3"#"$4}' //分别截取第一到第四段#隔开

 awk '/oo/' test.txt  //匹配含有oo字符的行

 awk -F ':' '$1 ~/oo/' test.txt  //表示让第一段匹配到oo的行

awk -F ':' '$1~/o+/' test.txt  //表示第一段匹配到至少一个o或者多个的行

 awk -F ':' '/root/ {print $1,$3} /test/ {print $1,$3}' test.txt //匹配含有root行输出第一和第三段,匹配test的行输出第一和第三段

 awk -F ':' '$3=="0"' /etc/passwd  

 awk -F ':' '$3>="500"' /etc/passwd  //第三段大于等于500的(500被认为一个字符串)

 awk -F ':' '$3>=500' /etc/passwd  //第三段大于等于500的。数字不要加双引号(加双引号会被认为是一个字符串)。

 awk -F ':' '$7!="/sbin/nologin"' /etc/passwd //第七段不是/sbin/nologin字符串(要加双引号)

 

user2

user6

lsx

lsx2

[root@lsx-02 awk]# awk -F ':' '{print $1}' passwd  打印第一段 所有段(整行)0表示 不指定分隔符默认以空格分开

 

user6 x 1001 1001

lsx x 1011 1011

lsx2 x 1012 1012

[root@lsx-02 awk]# awk -F ':' '{print $1,$2,$3,$4}' passwd

 

user6#x#1001#1001

lsx#x#1011#1011

lsx2#x#1012#1012

[root@lsx-02 awk]# awk -F ':' '{print $1"#"$2"#"$3"#"$4}' passwd 以什么连接“”引起来

 

[root@lsx-02 awk]# awk -F ':' '$1 ~/oo/' passwd  匹配把第一段含有oo的字符打印出来

root:x:0:0:root:/root:/bin/bash

rooooaiperator:x:11:0:operator:/rcot:/sbin/nologin

[root@lsx-02 awk]# awk -F ':' '$1 ~/o+/' passwd 优势于grep sed

root:x:0:0:root:/root:/bin/bash

daemon:x:2:2:daemon:/sbin:/sbin/nologin

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

 

[root@lsx-02 awk]# sed -n '/oo/p' passwd 类似于awk同上

root:x:0:0:root:/root:/bin/bash

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

 

[root@lsx-02 awk]# awk -F ':' '/root/ {print$1,$5} /bus/ {print $2,$3}' passwd

root root

x 81

 

[root@lsx-02 awk]# egrep 'root|bus' passwd   egrep

root:x:0:0:root:/root:/bin/bash

dbus:x:81:81:System message bus:/:/sbin/nologin

[root@lsx-02 awk]# awk '/root|bus/' passwd  同上

root:x:0:0:root:/root:/bin/bash

dbus:x:81:81:System message bus:/:/sbin/nologin

 

user6:x:1001:1001::/home/user11:/bin/bash

lsx:x:1011:1011::/home/lsx:/bin/bash

lsx2:x:1012:1012::/home/lsx2:/bin/bash

[root@lsx-02 awk]# awk -F ':' '$3>="1000"' passwd  不是针对数字的不要加双引号,加双引号是按Asicc

 

[root@lsx-02 awk]# awk -F ':' '$7!="/sbin/nologin"' passwd  字符串要双引号括起来

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/SBin/nologin

 

awk -F ':' '$3<$4' /etc/passwd  //第三段小于第四段

 awk -F ':' '$3>"5" && $3<"7"' /etc/passwd 第三段字符大于5并且第三段字符小于7

 awk -F ':' '$3>1000 || $7=="/bin/bash"' /etc/passwd //第三段大于100或者第七段等于..

awk -F ':' '$3>100 || $1~/root/' test.txt //匹配

 head -5 /etc/passwd |awk -F ':' '{OFS="#"} {print $1,$3,$4}

awk -F ':' '{OFS="@"} $3>10 || $1=="root" {print $1,$2,$3}' test.txt //OFSprint打印指定用什么符号作为分隔符  OFSprint顺序改变会影响结果。两个大括号之间设置条件

root@x@0

operator@x@11

 

 awk -F ':' '{OFS="#"} {if ($3>1000) {print $1,$2,$3,$4}}' /etc/passwd

awk -F ':' '{OFS="!"} $1~/root/ {print $1,$2,$3}' test.txt

root!x!0

awk -F ':' '{OFS="!"} {if ($1~/root/) {print $1,$2,$3}}' test.txt  //这种便于理解

root!x!0

 

 head -n3 /etc/passwd | awk -F ':' '{print NF}

awk -F ':' '{print NF}' test.txt  //以冒号为分隔符,输出一共多少段。-NF

7

7

7

 

 head -n3 /etc/passwd | awk -F ':' '{print NR}

awk -F ':' '{print NR":"$0}' test.txt  //输出一共多少行

1:root:x:0:0:root:/root:/bin/bash

2:bin:x:1:1:bin:/bin:/sbin/nologin

 

 awk 'NR>40' /etc/passwd

awk 'NR<=10' test.txt  //打印110

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

 

 awk -F ':' 'NR<20 && $1 ~ /roo/' /etc/passwd 

awk 'NR<=10 && $1 ~ /root|sync/' test.txt  //匹配小于等于10行并且第一段包含root或者sync字符

root:x:0:0:root:/root:/bin/bash

sync:x:5:0:sync:/sbin:/bin/sync

operator:x:11:0:operator:/root:/sbin/nologin

 

 head -n 3 /etc/passwd |awk -F ':' '$1="root"

 awk -F ':' '{(tot=tot+$3)}; END {print tot}' /etc/passwd

 awk -F ':' '{if ($1=="root") {print $0}}' /etc/passwd

 

[root@lsx-02 awk]# awk -F ':' '$3>"5" && $3<"7"' passwd

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

 

[root@lsx-02 awk]# awk -F ':' '$3>1000 || $7~/bash/' passwd  

root:x:0:0:root:/root:/bin/bash

user1:x:1006:1001::/home/lsx3:/sbin/nologin

lsx6:x:1009:1009::/home/lsx6:/bin/bash

user2:x:1010:1010::/home/user2:/bin/bash

user6:x:1001:1001::/home/user11:/bin/bash

 

[root@lsx-02 awk]# awk -F ':' '{OFS="#"} $3>1000 || $7~/bash/ {print$1,$2,$3}'  passwd   OFS  print打印指定分割符号

root#x#0

user1#x#1006

lsx6#x#1009

 

[root@lsx-02 awk]# awk -F ':' '{OFS="#"} {if($3>1000){print$1,$2,$3}}'  passwd

user1#x#1006

lsx6#x#1009

user2#x#1010

 

25user2:x:1010:1010::/home/user2:/bin/bash

26user6:x:1001:1001::/home/user11:/bin/bash

27lsx:x:1011:1011::/home/lsx:/bin/bash

28lsx2:x:1012:1012::/home/lsx2:/bin/bash

[root@lsx-02 awk]# awk -F ':' '{print NR$0}' passwd  NR显示所有的行号

 

NF :用分隔符分隔后一共有多少段

NR :行数

awk -F ':' '{print $NF}' test.txt  //$NF 表示最后一段的值

/bin/bash

/sbin/nologin

 

7user2:x:1010:1010::/home/user2:/bin/bash

7user6:x:1001:1001::/home/user11:/bin/bash

7lsx:x:1011:1011::/home/lsx:/bin/bash

7lsx2:x:1012:1012::/home/lsx2:/bin/bash

[root@lsx-02 awk]# awk -F ':' '{print NF$0}' passwd  NR打印有几段

 

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

halt:x:7:0:halt:/sbin:/sbin/halt

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

[root@lsx-02 awk]# sed -n '1,10p' passwd

 

sync:x:5:0:sync:/sbin:/bin/sync

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

halt:x:7:0:halt:/sbin:/sbin/halt

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

[root@lsx-02 awk]# awk -F ':' 'NR<=10' passwd 同上 打印前10

 

[root@lsx-02 awk]# awk -F ':' 'NR<=10 && $1~/root|sync/' passwd

root:x:0:0:root:/root:/bin/bash

sync:x:5:0:sync:/sbin:/bin/sync

 

[root@lsx-02 awk]# awk -F ':' '{print $NR":"$NF}' passwd   1-7  30-7

root:/bin/bash

x:/sbin/nologin

2:/sbin/nologin

4:/sbin/nologin

lp:/sbin/nologin

/sbin:/bin/sync

/sbin/shutdown:/sbin/shutdown

:/sbin/halt

 

[root@lsx-02 awk]# sed -n '3,4p' passwd | awk -F ':' '$1="root"'   =赋值

root

root x 2 2 daemon /sbin /sbin/nologin

awk -F ':' '{OFS="@"} $1="root"' test.txt  //OFS

root@x@0@0@root@/root@/bin/bash

 

[root@lsx-02 awk]# awk -F ':' '{{tot=tot+$3}}; END {print tot}' passwd  值相加

7704

[root@lsx-02 awk]# awk -F ':' '{tot=tot+$4};END{print tot}' passwd

7801

 

(杀鸡焉用宰牛刀)

[root@lsxlinux02 awk]# grep -E 'root|User' test.txt

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

polkitd:x:999:998:User for polkitd:/:/sbin/nologin

[root@lsxlinux02 awk]# sed -nr '/root|User/'p test.txt

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

polkitd:x:999:998:User for polkitd:/:/sbin/nologin

[root@lsxlinux02 awk]# awk '/root|User/ {print $0}' test.txt

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

polkitd:x:999:998:User for polkitd:/:/sbin/nologin

 

df -h|awk 'NR==2 {print $5}'

10%

 

 

小结:sed擅长输出行,awk擅长列




本文转自 虾米的春天 51CTO博客,原文链接:http://blog.51cto.com/lsxme/1984094,如需转载请自行联系原作者

相关文章
|
2月前
|
运维 监控 数据处理
常用的运维工具:基本的命令行工具详解(grep, awk, sed)
常用的运维工具:基本的命令行工具详解(grep, awk, sed)
51 14
常用的运维工具:基本的命令行工具详解(grep, awk, sed)
|
6月前
|
数据处理 Perl
AWK 命令20条
AWK 命令示例:显示文件内容、按列打印、计数、使用分隔符、模式匹配、条件语句、数学计算、数组操作、字符串处理、循环、输出格式控制、删除重复行、统计行词字符、分组统计、格式化输出、字段联合、自定义分隔符、字符串截取和调用外部命令。AWK 是强大的文本分析工具,适用于各种数据处理任务。
118 1
|
运维 Shell Linux
linux文本处理工具——grep、sed、awk用法
linux文本处理工具——grep、sed、awk用法
148 1
|
Linux Perl
linux高级命令行文本处理cut,sed,awk
cut   sort排序 wc  sed linux sed的详细指令 -i会删除 删除 替换 AWK awk命令详解   ...
1774 0
|
Linux 网络安全 Perl
Linux的文本处理工具浅谈-awk sed grep
Linux的文本处理工具浅谈 awk   老大 【功能说明】 用于文本处理的语言(取行,过滤),支持正则 NR代表行数,$n取某一列,$NF最后一列 NR==20,NR==30 从20行到30行 FS竖着切,列的分隔符 RS横着切,行的分隔符 ...
1429 0