Linux中的awk命令
awk是Linux中最强大的命令之一。
我们可以使用awk命令管理数据并生成报告。
它还允许我们使用逻辑操作,变量,打印功能等等。
Awk代表"AHO,Weinberger和Kernighan",主要用于模式扫描和处理。
它搜索一个或者多个文件以查看它们是否包含与指定模式匹配的行,然后执行关联操作。
它从文件或者其标准输入读取并输出到其标准输出。
对于每行,如果匹配执行相应的操作,则它将具有给定的模式的给定模式匹配。
特征
将文本文件视为记录和字段它具有变量,条件和循环具有算术和串运算符可以生成格式化报告从字符串或者文件中读取和编辑文本
在本教程中,我们将使用示例查看awk linux命令,并查看它可以执行的操作。
awk的pasix语法
AWK命令的基本语法如下所示:
awk options program input-file
每个选项的简要说明如下所示:
-f fs:用于指定文件分隔符。
-f文件:用于指定包含awk脚本的文件。
-v var = value:用于声明变量。
我们将使用以下文本文件作为本文所有示例的输入文件:
cat > contents.txt hitesh engineer sales 30000 jayesh director account 25000 vyom manager purchase 20000 bhavesh engineer sales 30000 rajesh directory sales 40000 niraj clerk account 20000 jay peon purchase 23000 deep clerk sales 20000
现在,让我们使用awk命令查看名为'content.txt'的文件的内容:
awk '{print}' contents.txt
这将打印文件的内容,如下所示:
hitesh engineer sales 30000 jayesh director account 25000 vyom manager purchase 20000 bhavesh engineer sales 30000 rajesh directory sales 40000 niraj clerk account 20000 jay peon purchase 23000 deep clerk sales 20000
在上面的示例中,没有给出任何模式,因此它将打印整个文件。
现在,打印与模式"销售"模式匹配的所有线路:
awk '/sales/{print}' contents.txt
这将打印包含"销售"单词的所有行,如下所示:
hitesh engineer sales 30000 bhavesh engineer sales 30000 rajesh directory sales 40000 deep clerk sales 20000
扶手中的变量
awk附带了一些内置变量,用于将一系列文本分成单独的单词或者名为字段的片段。
其中一些如下所示:
$0:用于整个线路。
$1:用于第一个字段。
$2:用于第二个字段。
$n:用于第n个字段。
NR:用于指定当前记录的总数。
NF:用于指定记录中的字段总数。
FS:它包含字段分隔符,用于划分输入行上的字段。
RS:它存储当前记录分隔符。
OFS:它存储输出字段分隔符,用于在AWK打印时分隔字段。
ORS:它存储输出记录分隔符,用于在AWK打印时分隔输出线。
现在,从文件内容打印字段No 1和3.txt使用以下语法:
awk '{print ,}' contents.txt
我们应该只看到文件contents.txt的第一个和第三字段:
hitesh sales jayesh account vyom purchase bhavesh sales rajesh sales niraj account jay purchase deep sales
我们可以使用NR使用AWK命令来打印所有行以及行号:
awk '{print NR,1 hitesh engineer sales 30000 2 jayesh director account 25000 3 vyom manager purchase 20000 4 bhavesh engineer sales 30000 5 rajesh directory sales 40000 6 niraj clerk account 20000 7 jay peon purchase 23000 8 deep clerk sales 20000}' contents.txt
输出:
awk '{print ,$NF}' contents.txt
我们可以使用NF显示最后一个字段和1美元以显示第一个字段:
hitesh 30000 jayesh 25000 vyom 20000 bhavesh 30000 rajesh 40000 niraj 20000 jay 23000 deep 20000
这将打印文件contents.txt的第一个和最后一个字段:
awk 'NR==2, NR==5 {print NR,2 jayesh director account 25000 3 vyom manager purchase 20000 4 bhavesh engineer sales 30000 5 rajesh directory sales 40000}' contents.txt
要打印2到5的行号使用NR变量,如下所示:
awk 'END { print NR } ' contents.txt
输出:
8
要使用NR计算文件内容中的行数。
awk 'BEGIN { action; } /search/{ action; } END { action; }' input_file
我们应该看到以下输出:
awk 'BEGIN { print "Start Process." }; { print }; END { print "End Process." }' contents.txt
开始和结束块
还有一个可选的开始和结束块,可以分别包含在文件处理之前和之后执行的命令。
开始块用于执行在处理记录后处理记录之前在处理记录后执行操作之前的操作。
使用AWK命令的使用BEGIN和END块的基本语法如下所示:
Start Process. engineer director manager engineer directory clerk peon clerk End Process.
我们可以使用BEGIN和END块打印有关我们正在打印的字段的信息。
以下示例将在文件内容中处理每个记录的第二个字段之前和之后打印消息.txt:
awk 'BEGIN { FS=":"; print "User\t\tUID\t\tGID\t\tHome\t\tShell\n--------------"; } {print ,"\t\t",,"\t\t",,"\t\t",,"\t\t",;} END { print "---------\nFile Complete" }' /etc/passwd
输出:
User UID GID Home Shell ------------- root 0 0 /root /bin/bash daemon 1 1 /usr/sbin /usr/sbin/nologin bin 2 2 /bin /usr/sbin/nologin sys 3 3 /dev /usr/sbin/nologin sync 4 65534 /bin /bin/sync games 5 60 /usr/games /usr/sbin/nologin man 6 12 /var/cache/man /usr/sbin/nologin lp 7 7 /var/spool/lpd /usr/sbin/nologin mail 8 8 /var/mail /usr/sbin/nologin news 9 9 /var/spool/news /usr/sbin/nologin uucp 10 10 /var/spool/uucp /usr/sbin/nologin proxy 13 13 /bin /usr/sbin/nologin www-data 33 33 /var/www /usr/sbin/nologin -------- File Complete
我们还可以使用BEGIN和END块来将数据从文件转换并转换为表。
以下示例将将文件/etc/passwd转换为表:
awk '{ if ( ~ /sales/) print}' contents.txt
输出:
hitesh engineer sales 30000 bhavesh engineer sales 30000 rajesh directory sales 40000 deep clerk sales 20000
条件搜索
AWK命令还支持几种条件语句,包括循环,循环等,包括循环等。
这将有助于我们获取与特定条件匹配的行。
以下示例将使用"if"条件打印第三个字段中包含"销售"的所有行:
awk '{ for (i = 1; i <= 3; i++) print $i }' contents.txt
输出:
hitesh engineer sales jayesh director account vyom manager purchase bhavesh engineer sales rajesh directory sales niraj clerk account jay peon purchase deep clerk sales
以下示例将使用"for"循环打印每个记录的前三个字段,每行一个。
awk '{ i = 1; while ( i <= 2 ) { print $i i++ } }' contents.txt
输出:
hitesh1 engineer2 jayesh1 director2 vyom1 manager2 bhavesh1 engineer2 rajesh1 directory2 niraj1 clerk2 jay1 peon2 deep1 clerk2
以下示例将使用"while"循环打印每个记录的前两个字段,每行一个。
ip a s wlan0
输出:
2: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 4c:bb:58:9c:f5:55 brd ff:ff:ff:ff:ff:ff inet 172.20.10.3/28 brd 172.20.10.15 scope global wlan0 valid_lft forever preferred_lft forever inet6 2401:4900:1d71:ef26:8846:95b2:4ca8:aa7d/64 scope global temporary dynamic valid_lft 600574sec preferred_lft 81574sec inet6 2401:4900:1d71:ef26:4ebb:58ff:fe9c:f555/64 scope global dynamic valid_lft forever preferred_lft forever inet6 fe80::4ebb:58ff:fe9c:f555/64 scope link valid_lft forever preferred_lft forever
从其他命令处理输出
我们还可以使用awk命令从另一个命令解析输出,而不是指定文件名。
"IP A"命令打印有关系统IP,MAC地址和其他网络相关信息的信息,如下所示:
ip a s wlan0 | awk -F '[\/]+' '/inet/{print }
输出:
172.20.10.3
现在,我们可以使用awk命令仅打印系统的IP地址,如下所示:
awk 'length(jayesh director account 25000 bhavesh engineer sales 30000 rajesh directory sales 40000) > 27' contents.txt
我们应该看到以下输出:
awk 'BEGIN { for(i=1; i<=5; i++) print "Cube of",i,"is",i*i*i; }'
awk命令前进例子
示例1:awk命令允许我们打印带有一些指定字符数的行。
例如,具有超过27个字符的打印行,使用以下命令:
Cube of 1 is 1 Cube of 2 is 8 Cube of 3 is 27 Cube of 4 is 64 Cube of 5 is 125
输出:
awk 'END { print NR }' contents.txt
示例2:检查给定数量的多维数据集
要打印给定编号的多维数据集,请运行以下命令:
8
输出:
awk '{ if (length(29) > max) max = length(awk -F: '{ print }' contents.txt | sort) } END { print max }' contents.txt
示例3:计算指定文件中的行数
我们可以检查指定文件中的行数并使用以下命令打印它:
bhavesh engineer sales 30000 deep clerk sales 20000 hitesh engineer sales 30000 jayesh director account 25000 jay peon purchase 23000 niraj clerk account 20000 rajesh directory sales 40000 vyom manager purchase 20000
输出:
awk 'NR % 2 == 0' contents.txt
示例4:找到给定文件中的最长行并打印字符
我们可以在给定文件中找到最长的行,并使用以下命令打印该行的字符:
jayesh director account 25000 bhavesh engineer sales 30000 niraj clerk account 20000 deep clerk sales 20000
输出
awk 'BEGIN{OFS="|"}{print ,,,}' contents.txt
示例5:对给定文件的第一列进行排序
要对文件内容的第一列进行排序和打印.txt,请运行以下命令:
hitesh|engineer|sales|30000 jayesh|director|account|25000 vyom|manager|purchase|20000 bhavesh|engineer|sales|30000 rajesh|directory|sales|40000 niraj|clerk|account|20000 jay|peon|purchase|23000 deep|clerk|sales|20000
输出:
##代码##示例6:打印偶数线
要在文件Contents.txt中仅打印均匀的行,请运行以下命令:
##代码##输出:
##代码##示例7:更改字段分隔符
我们可以将已归档的分隔符从空间更改为|并使用以下命令打印它:
##代码##输出:
##代码##