awk命令基本使用(1)

1、通过man awk可知它的详情

awk 是一种编程语言,awk有很多内建的功能,比如数组、函数等.....

实例1通过awk得到IP

[root@localhost ~]# ifconfig
em1       Link encap:Ethernet  HWaddr 14:18:77:70:62:20  
          inet addr:10.12.50.78  Bcast:10.12.50.255  Mask:255.255.255.0
          inet6 addr: fe80::1618:77ff:fe70:6220/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:5893345 errors:0 dropped:0 overruns:0 frame:0
          TX packets:165708 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:886835464 (845.7 MiB)  TX bytes:160953846 (153.4 MiB)
          Interrupt:41 

[root@localhost ~]# ifconfig em1|awk -F '[ :]+' 'NR==2 {print $4}'
10.12.50.78

[root@localhost ~]#

awk相关解释: -F 是指定分隔符;'[ :]+ ' 代表正则;中括号内的是要匹配的内容;‘+’代表匹配连续多个。例子中代表匹配多个空格及“:"作为分隔符;NR 是awk的内置变量代表行 $4 代表第4列;print 是输出;
              inet    addr:10.12.50.78  
第1列   第2列  第3列   第4列

(1、2,3列是以空格为分隔符) (3,4是以“ : ” 分隔符)

注意:awk 后跟的语句必须用单引号包含

[root@localhost ~]# ifconfig em2|awk -F "[ :]+" 'NR==2 {print $4}'  
10.11.45.90
[root@localhost ~]# ifconfig em2|awk -F "[ :]+" "NR==2 {print $4}"
            inet addr:10.12.50.78  Bcast:10.12.50.255  Mask:255.255.255.0

实例2通过awk得到行号,得到列
[root@localhost ~]# awk  '{print NR,$0}' /etc/passwd  
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@localhost ~]#

实例相关解释:NR(每行的记录号,多文件记录递增)代表行;$0代表整行内容;$1代表第一列$2第二列$3.....$NF最后一列,$(NF-1)

[root@localhost ~]# awk  -F ":" '{print $(NF-1)":"$NF}' /etc/passwd 
/root:/bin/bash
/bin:/sbin/nologin
/sbin:/sbin/nologin
/var/adm:/sbin/nologin
/var/spool/lpd:/sbin/nologin
/sbin:/bin/sync
/sbin:/sbin/shutdown

实例3通过awk 取出5到8行的内容

[root@localhost ~]# awk  '{if(NR<9 && NR>4) print NR,$0}' /etc/passwd  
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
[root@localhost ~]# 

实例4通过awk过滤空格或#

原数据

[root@localhost ~]# cat awke 
#Include conf/extra/httpd-ssl.conf
#
# Note: The following must must be present to support
#       starting without SSL on platforms with no /dev/random equivalent
#       but a statically compiled-in mod_ssl.
#
<IfModule ssl_module>

SSLRandomSeed startup builtin

SSLRandomSeed connect builtin

</IfModule>
[root@localhost ~]# 

处理后的数据
[root@localhost ~]# awk '/^[^ ]/' awke 
#Include conf/extra/httpd-ssl.conf
#
# Note: The following must must be present to support
#       starting without SSL on platforms with no /dev/random equivalent
#       but a statically compiled-in mod_ssl.
#
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>
[root@localhost ~]# awk '/^[^ #]/' awke
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>

实例相关解释 '/^[^ #]/';
                       红的^排除[]里的内容;中括号内的橙黄色^是以空格开头

实例5awk计算内存占用率

[root@localhost ~]# free -m
             total       used       free     shared    buffers     cached
Mem:         31994       3593      28401          0        175       1175
-/+ buffers/cache:       2242      29751
Swap:        16063          0      16063
[root@localhost ~]# MEMUsed=$(free -m|egrep "Mem"|awk '{print $3}')                     
[root@localhost ~]# MEMTotal=$(free -m|egrep "Mem"|awk '{print $2}')                    
[root@localhost ~]# MEMUsage=$(awk 'BEGIN{printf"%.0f\n",('$MEMUsed'/'$MEMTotal')*100}')
[root@localhost ~]# echo  $MEMUsage
11
[root@localhost ~]# 

[root@localhost ~]# MEMUsage=$(awk 'BEGIN{printf"%.2f\n",('$MEMUsed'/'$MEMTotal')}')    
[root@localhost ~]# echo  $MEMUsage
0.11

实例5相关解释:awk 指定输出格式

awk 'BEGIN{printf"%.2f\n",('$MEMUsed'/'$MEMTotal')*100}'

printf

%f                                     浮点型 #使用小数点后2位%.2f (用于除法后)

BEGIN与END的作用是给程序赋予初始状态和程序结束后执行扫尾的工作;任何在BEGI 之后列出的操作({}内)awk开始扫描输入之前执行,END扫描全部的输入之前执行结束之后执行。通常使用BEIN来显示变量和初始化变量,使用END来输出最后的结果。

[root@localhost  ]# awk 'BEGIN{array[1]="abc";array[2]="efg";for(key in array) print key,array[key]}'   不需要跟文件
1 abc
2 efg
[root@localhost ]# 

[root@localhost ~]# echo qw> /home/a.log 
[root@localhost ~]# awk '{array[1]="abc";array[2]="efg";}END{for(key in array) print key,array[key]}' /home/a.log ##后跟任意文件才能输出结果
1 abc
2 efg

 

 

 

 

 

### awk 命令使用教程与示例 #### 1. awk 基本概念 awk 是一种模式扫描和处理语言,专门用于文本处理。任何 awk 语句都由模式和动作组成,模式决定动作语句的触发条件和触发时间[^1]。在 Linux 系统中,常用的 awk 实现是 gawkawk 是 gawk 的链接文件[^1]。 #### 2. awk 命令格式 awk基本命令格式如下: ```bash awk [选项] '模式 {动作}' 文件名 ``` - `[选项]`:可选参数,如 `-F` 指定字段分隔符。 - `模式`:匹配条件,可以是正则表达式或逻辑表达式。 - `{动作}`:当匹配成功时执行的动作。 - `文件名`:需要处理的文件。 #### 3. 示例:简单输出 以下命令会读取 `/etc/passwd` 文件,并以冒号为分隔符打印第一列(用户名)[^4]: ```bash awk -F: '{print $1}' /etc/passwd ``` #### 4. 示例:条件过滤 以下命令会读取 `/etc/passwd` 文件,并仅输出用户 ID(第三列)大于等于 500 的普通用户[^4]: ```bash awk -F: '$3>=500 {print $1}' /etc/passwd ``` #### 5. 示例:复杂逻辑 以下命令会读取 `/etc/passwd` 文件,并根据用户 ID 判断是否为 root 用户或普通用户: ```bash awk -F: '{if($3==0){print $1,"the user is root"} else if($3>=500){print $1,"is common user"}}' /etc/passwd ``` #### 6. 示例:调用外部命令 以下命令会在 awk 中调用外部命令 `ls -l` 并逐行打印其输出[^5]: ```bash echo "" | awk '{cmd="ls -l"; while(cmd|getline lineData){printf("line:%s\n",lineData);};close(cmd);}' ``` #### 7. 示例:传递 shell 变量 以下命令会将 shell 变量 `class` 的值传递给 awk,并用于过滤 `students.csv` 文件中的特定列[^3]: ```bash class=2 awk -v c=$class -F',' '$4==c{print $0}' students.csv ``` #### 8. 示例:自定义函数 awk 支持用户定义函数,以下示例定义了一个计算平方的函数并调用它[^2]: ```awk awk 'function square(x) { return x * x } { print "Square of", $1, "is", square($1) }' <<< "5" ``` #### 9. 示例:动态正则表达式 以下命令使用动态正则表达式匹配包含数字的行[^2]: ```bash awk '/[0-9]+/ {print $0}' file.txt ``` ### 注意事项 - 默认情况下,awk 使用空格作为字段分隔符。如果需要指定其他分隔符,可以使用 `-F` 参数。 - awk 的强大之处在于其内置变量、支持正则表达式和用户自定义函数等功能[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值