单行awk代码示例
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[; { a =awk '{ print NR "\t"]++' contents.txt1 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.txtawk '{ printf("%5d : %s\n", NR,}' contents.txt1 : 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
删除连续重复行
要从文件中删除连续重复行,请执行以下命令:
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非常有用。
它打印出服务器的打开连接列表,并按金额对其进行排序。
我们应该按金额获取到服务器的所有打开连接列表:
##代码##