Linux中的awk命令

时间:2020-03-05 15:25:56  来源:igfitidea点击:

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:更改字段分隔符

我们可以将已归档的分隔符从空间更改为|并使用以下命令打印它:

##代码##

输出:

##代码##