linux 三剑客老大-awk

简介:

1,取指定行的指定列

[root@90-99 oldboy]# cat aa.txt 
1 a
2 b
3 c
4 d
5 e
6 f
7 g
8 h
9 i
10 j
11 k
12 l
13 m
14 n

[root@90-99 oldboy]# awk '{if(NR>=5 && NR<=10) print $1}' aa.txt#me:NR代表行号,&&代表并且
5
6
7
8
9
10

也可以使用sed来去行数,awk取列,命令如下:

sed  -n '5,10p' aa.txt  | awk '{print $1}'

[root@90-99 oldboy]# awk '{if(NR>=5 && NR<=10) print $2}' aa.txt  
e
f
g
h
i
j

2,巧用多个字段作为分隔符

[root@90-99 wuxy]# stat test.sh |sed -n '4p'
Access: (0664/-rw-rw-r--)  Uid: (  504/    wuxy)   Gid: (  504/    wuxy)

[root@90-99 wuxy]# stat test.sh |sed -n '4p'|awk -F "[(/]" '{print $1}'
Access: 
[root@90-99 wuxy]# stat test.sh |sed -n '4p'|awk -F "[(/]" '{print $2}'
0664
[root@90-99 wuxy]# stat test.sh |sed -n '4p'|awk -F "[(/]" '{print $3}'
-rw-rw-r--)  Uid: 
[root@90-99 wuxy]# stat test.sh |sed -n '4p'|awk -F "[(/]" '{print $4}'
  504

备注:

-F "[(/]" 代表以 ( 或者 / 作为分隔符!!   

在seq 中用-s指定分隔符。eg: 

[wuxy@robin shell]$ seq  -s "----" 5
1----2----3----4----5

3,NR代表行号,NF代表列数

取文件的最后一列

cat aa.txt | awk '{print $NF}'

4,awk过滤以某个字符开头的 行

[root@robin tmp]# ls -ld *
-rw-r--r--. 1 root root    0 Mar  8 14:42 a
lrwxrwxrwx. 1 root root   16 Mar  8 14:43 b -> /home/wuxy/tmp/a
drwxr-xr-x. 3 root root 4096 Mar  8 17:57 c
drwxr-xr-x. 2 root root 4096 Mar  8 17:58 e
[root@robin tmp]# ls -ld * | awk /^l/
lrwxrwxrwx. 1 root root   16 Mar  8 14:43 b -> /home/wuxy/tmp/a

[root@robin tmp]# ls -ld * | grep '^l'
lrwxrwxrwx. 1 root root   16 Mar  8 14:43 b -> /home/wuxy/tmp/a

[root@robin tmp]# ls -ld * |sed -n '/^l/p'
lrwxrwxrwx. 1 root root   16 Mar  8 14:43 b -> /home/wuxy/tmp/a

[root@robin robin]# ifconfig eth1 | awk '/inet addr/'   ###过滤以inet addr 开头的行
          inet addr:192.168.90.96  Bcast:192.168.90.255  Mask:255.255.255.0

[root@robin robin]# ifconfig eth1 | awk '/inet addr/ {print $3}'
Bcast:192.168.90.255


[root@robin robin]# ifconfig eth1 | sed -n '/inet addr/p' ###sed也可以完成
          inet addr:192.168.90.96  Bcast:192.168.90.255  Mask:255.255.255.0

5,取第二列到最后一列

[root@robin zabbix]# cat agent-info | grep MAC
MAC:00:21:F6:00:00:3B

需要MAC地址:00:21:F6:00:00:3B

[root@robin zabbix]# cat agent-info | grep MAC | awk -F":" '{for(i=2;i<=NF;i++) print $i}' 
00
21
F6
00
00
3B

[root@robin zabbix]# cat agent-info | grep MAC | awk -F":" '{for(i=2;i<=NF;i++) print $i":"}'
00:
21:
F6:
00:
00:
3B:

##print 默认打印完后的分隔符是换行符,可以用ORS=":" 来修改行分隔符,即把换行符换成冒号分隔

[root@robin zabbix]# cat agent-info | grep MAC | awk -F":" 'BEGIN{ORS=":"}{for(i=2;i<=NF;i++) print $i}'
00:21:F6:00:00:3B:[root@robin zabbix]# 

[root@robin zabbix]# cat agent-info | grep MAC | awk -F":" 'BEGIN{ORS=":"}{for(i=2;i<=NF;i++) print $i}' | wc -l
0

##没有换行符时,不是一行,改进如下:

[root@robin zabbix]# cat agent-info | grep MAC | awk -F":" 'BEGIN{ORS=":"}{for(i=2;i<=NF;i++) print $i;printf "\n"}'                  
00:21:F6:00:00:3B:

[root@robin zabbix]# cat agent-info | grep MAC | awk -F":" 'BEGIN{ORS=":"}{for(i=2;i<=NF;i++) printf $i;printf "\n"}'  
0021F600003B

[root@robin zabbix]# cat agent-info | grep MAC | awk -F":" 'BEGIN{ORS=":"}{for(i=2;i<=NF;i++) print $i;print "\n"}'  
00:21:F6:00:00:3B:

:[root@robin zabbix]#

注意循环完后用的时printf打印一个换行符 "\n",而不是print

最终命令为:

[root@robin zabbix]# cat agent-info | grep MAC | awk -F":" 'BEGIN{ORS=":"}{for(i=2;i<=NF;i++) print $i;printf "\n"}'  | sed 's#.$##g'

00:21:F6:00:00:3B

##print打印完成后默认换行,printf打印完成后默认不换行,需指定printf "\n",同时都可以用引号""指定输出的连接符

6,awk取指定行

[root@robin ~]# ifconfig eth1 | awk "NR==2" | cut -c 21-33              
192.168.90.96

[root@robin ~]# ifconfig eth1 | awk -F"[ :]+" 'NR==2 {print $4}'
192.168.90.96

7,awk变量

变量名     含义

ARGC       命令行变元个数

ARGV       命令行变元数组

FILENAME   当前输入文件名

FNR        当前文件的记录号

FS         输入域分隔符,默认为一个空格

RS         输入记录分隔符

NF         表示当前行记录域或列的个数

NR         表示当前行的记录号或行号

OFS        输出域分隔符

ORS        输出记录分隔符

$1         第一列,$2第二列,$0整行

$NF        最后一列

$(NF-1)    倒数第二




      本文转自Tenderrain 51CTO博客,原文链接:http://blog.51cto.com/tenderrain/1613172,如需转载请自行联系原作者



相关文章
|
8天前
|
Linux Perl
Linux|从 STDIN 读取 Awk 输入
Linux|从 STDIN 读取 Awk 输入
20 4
|
23天前
|
Linux Perl
Linux技巧|Awk 比较运算符
在 Awk 中,使用比较运算符(如 &gt;, &lt;, ==, != 等)可方便地过滤文本和字符串。本文通过示例展示了如何处理食品购物清单,标记数量小于或等于 20 的商品。 Awk 语法 `expression { actions; }` 用于根据条件执行操作,如在满足条件的行末尾添加特殊标记。例如,`$3 &lt;= 20 { printf &quot;%s\t%s\n&quot;, $0,&quot;TRUE&quot; ; }` 会在数量小于或等于 20 的行后添加 &quot;TRUE&quot;。继续探索 Awk 的比较运算符以进行更复杂的文本处理。
25 2
|
1月前
|
搜索推荐 Linux 开发工具
【Linux】深入理解awk命令
【Linux】深入理解awk命令
42 0
|
2月前
|
Linux Perl
百度搜索:蓝易云【Linux常用命令awk】
以上仅是awk命令的一些常见用法,它还有许多更复杂的功能和用法,可以根据需要灵活运用。awk在文本处理和数据分析中非常实用,是Linux系统中的一把利器。
25 2
|
3月前
|
网络协议 关系型数据库 MySQL
Linux awk
Linux awk
29 0
|
3月前
|
监控 Linux BI
linux命令之awk
linux命令之awk
24 4
|
4月前
|
Unix Java Linux
Linux脚本中的字符处理与awk编程|WC统计
Linux脚本中的字符处理与awk编程|WC统计
45 0
|
5月前
|
存储 Linux Shell
Linux awk命令
除了使用 sed 命令,Linux 系统中还有一个功能更加强大的文本数据处理工具,就是 awk。 曾有人推测 awk 命令的名字来源于 awkward 这个单词。其实不然,此命令的设计者有 3 位,他们的姓分别是 Aho、Weingberger 和 Kernighan,awk 就取自这 3 为大师姓的首字母。 和 sed 命令类似,awk 命令也是逐行扫描文件(从第 1 行到最后一行),寻找含有目标文本的行,如果匹配成功,则会在该行上执行用户想要的操作;反之,则不对行做任何处理。awk 命令的基本格式为: [root@localhost ~]# awk [选项] '脚本命令' 文件名
73 1
|
6月前
|
Unix 测试技术 Linux
软件测试|Linux三剑客之awk命令详解
软件测试|Linux三剑客之awk命令详解
63 0
|
1月前
|
存储 监控 Linux
性能工具之linux三剑客awk、grep、sed详解
Linux 三剑客 awk,sed和grep 在性能领域广泛用于性能建模、性能监控及性能分析等方面,也是各大互联网公司测试岗高频面试题,中高端测试人员必备技能之一。
51 1
性能工具之linux三剑客awk、grep、sed详解