单行awk代码示例

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

Awk是一个非常强大而且便于为高级文本处理的工具。
它按行搜索并扫描文件行,将每个输入行拆分为字段,将输入行或者字段与模式进行比较,并在匹配的行上执行操作。
通常,它用于转换数据文件并生成格式化报告。

在本教程中,我们将显示一些高级和方便的AWK单衬里示例,以执行日常运营是有用的。

文本转换

在本节中,我们将学习如何使用sub和gsub函数使用awk命令删除文件中的选项卡和空格。

我们将使用以下文本文件作为本文所有示例的输入文件:

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

从文件中删除所有空行

我们可以使用具有特殊NF变量的AWK命令删除文件中的所有空行。

例如,从文件内容中删除所有空行.TXT运行以下命令:

awk NF 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 '/./' /contents.txt

从每行开头删除前导空白和标签

我们可以使用awk命令在文件开头找到一个或者多个空格或者选项卡并将其删除。

运行以下命令以从名为contents.txt的文件中删除前导空白

awk '{ sub(/^[ \t]+/, ""); 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

从每一行的末尾删除尾随空格和选项卡

我们可以在文件中的每一行的末尾找到一个或者多个空格或者标签并删除它们。

运行以下命令以删除文件内容中的每行末尾的空间和标签.txt

awk '{ sub(/[ \t]+$/, ""); 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 '{ gsub(/^[ \t]+|[ \t]+$/, ""); 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单行,它记录数组中的所有行,并以相反的顺序排列。

运行此AWK单行以在文件内容中以相反的顺序排列所有行.txt:

awk '{ a[i++] = 
deep clerk sales 20000
jay peon purchase 23000
niraj clerk account 20000
 rajesh directory sales 40000
bhavesh engineer sales 30000 
vyom manager purchase 20000	
jayesh  director account 25000
	hitesh engineer sales 30000
} END { for (j=i-1; j>=0;) print a[j--] }' contents.txt

我们应该收到以下输出:

awk '{ for (i=NF; i>0; i--) printf("%s ", $i); printf ("\n") }' contents.txt

每行中的字段的相反顺序

我们可以使用NF变量的AWK命令以相反的顺序排列每行中的每个字段。

30000 sales engineer hitesh 
25000 account director jayesh 
20000 purchase manager vyom 
30000 sales engineer bhavesh 
40000 sales directory rajesh 
20000 account clerk niraj 
23000 purchase peon jay 
20000 sales clerk deep

我们应该收到以下输出:

awk 'a != 
awk '!a[
awk '{ print NR "\t" 
1		hitesh engineer sales 30000
2	jayesh director account 25000
3	vyom manager purchase 20000	
4	
5	bhavesh engineer sales 30000 
6	 rajesh directory sales 40000
7	niraj clerk account 20000
8	jay peon purchase 23000
9	deep clerk sales 20000
}' contents.txt
]++' contents.txt
; { a =
awk '{ printf("%5d : %s\n", NR, 
1 : 	hitesh engineer sales 30000
    2 : jayesh director account 25000
    3 : vyom manager purchase 20000	
    4 : 
    5 : bhavesh engineer sales 30000 
    6 :  rajesh directory sales 40000
    7 : niraj clerk account 20000
    8 : jay peon purchase 23000
    9 : deep clerk sales 20000
) }' contents.txt
}' contents.txt

删除连续重复行

要从文件中删除连续重复行,请执行以下命令:

awk 'NF { 
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
=++a " :"
awk '/engineer/{n++}; END {print n+0}'  contents.txt
}; { print }' contents.txt

删除非线性重复的线条

要从文件中删除非线性重复行,请执行以下命令:

2

编号和计算

在本节中,我们将学习如何使用AWK命令使用FN和NR变量。
它用于处理和报告,例如记录数,字段数。

文件中的所有行

我们可以使用以下命令编号特定文件中的所有行:

awk '/engineer/' contents.txt

我们应该收到以下输出:

hitesh engineer sales 30000
bhavesh engineer sales 30000

数字线以花哨的方式

要以花哨格式的特定文件中的所有行,请运行以下命令:

awk '!/jayesh/' contents.txt

我们应该收到以下输出:

hitesh engineer sales 30000
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 '/rajesh/{print x};{x=
bhavesh engineer sales 30000
}' contents.txt

我们应该收到以下输出:

awk '/account/{getline; print}' contents.txt

打印包含特定字符串的行数

我们可以使用以下命令打印具有Word Engineer Word Engineer的行总数:

vyom manager purchase 20000	
jay peon purchase 23000

我们应该收到以下输出:

awk '{gsub(/engineer/, "doctor")};{print}' contents.txt

常用表达

在本节中,我们将向我们展示如何使用AWK命令使用正则表达式来过滤文件中的文本或者字符串。

打印与指定字符串匹配的行

要打印与文件内容中的字符串工程师匹配的所有行.TXT匹配,请运行以下命令:

hitesh doctor sales 30000
jayesh director account 25000
vyom manager purchase 20000	
bhavesh doctor sales 30000 
 rajesh directory sales 40000
niraj clerk account 20000
jay peon purchase 23000
deep clerk sales 20000

我们应该收到以下输出:

awk '{gsub(/jayesh|hitesh|bhavesh/,"mahesh");print}' contents.txt

打印不匹配指定字符串的行

要打印Don,T匹配File Contents.txt中的字符串"jayesh"的所有行,请运行以下命令:

mahesh engineer sales 30000
mahesh director account 25000
vyom manager purchase 20000	
mahesh engineer sales 30000 
 rajesh directory sales 40000
niraj clerk account 20000
jay peon purchase 23000
deep clerk sales 20000

我们应该收到以下输出:

df -h | awk '{print , }'

匹配字符串之前的打印线

要在匹配字符串'Rajesh'之前打印行,请运行以下命令:

Filesystem Avail
/dev/sda1 235G
none 4.0K
udev 1.9G
tmpfs 377M
none 5.0M
none 1.5G
none 100M
/dev/sda5 135G
/dev/loop0 0
/dev/loop1 0
/dev/loop2 0
/dev/loop4 0

我们应该收到以下输出:

netstat -ntu | awk '{print }' | cut -d: -f1 | sort | uniq -c | sort -n

匹配字符串后打印行

要在匹配字符串'rajesh'后打印行,请运行以下命令:

18 103.132.192.30
      12 104.18.12.5
      11 104.18.5.23
      9 104.244.42.3
      1 104.244.42.5
      1 127.0.0.1

我们应该收到以下输出:

##代码##

代换

在本节中,我们将向我们展示如何使用awk命令来搜索特定字符串的文件并用所需的字符串替换它。

用其他替换字符串

要在Contents.txt中用'doctor'替换字符串"工程师",请运行以下命令:

##代码##

我们应该收到以下输出:

##代码##

找到字符串"jayesh",'hitsh'或者'bhavesh'并用string'mahesh'替换它们,运行以下命令:

##代码##

我们应该收到以下输出:

##代码##

使用设备名称查找免费磁盘空间

我们可以使用DF使用AWK命令查找并仅显示每个设备使用的设备名称和空格。

为此,请运行以下命令:

##代码##

我们应该收到以下输出:

##代码##

查找每个IP的打开连接数

如果我们认为服务器受到攻击,这款Awk One-Liner非常有用。
它打印出服务器的打开连接列表,并按金额对其进行排序。

##代码##

我们应该按金额获取到服务器的所有打开连接列表:

##代码##