你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

如何使用一行awk命令执行日常任务

[复制链接]
gaosmile 发布时间:2020-10-23 20:29
Awk是为高级文本处理而设计的非常强大的工具。它逐行搜索扫描文件,将输入的每行分割成字段,将输入行或字段与模式进行比较,并对匹配的结果执行操作。本节将使用sub和gsub函数和awk命令来删除文件中的制表符和空格。我们将使用以下文本文件作为本文中所有示例的输入文件:
) A2 l' F3 J+ |. W4 e
[root@localhost ~]# cat << EOF >> content.txt  C" C& K; T& V
* i' k4 |; ^* \8 ~" [4 N
<以上代码可复制粘贴,可往左滑>出现大于号时将以下内容复制到终端,将文本内容保存到content.txt文件中。
+ J5 ^5 O: \6 c$ w' l8 U5 S
        hitesh engineer sales 30000) A& e, y' Z9 D; M& V8 F* ?
jayesh director account 25000' n3 ?& s4 Y5 b  s8 K
vyom manager purchase 20000
2 C8 U' `2 k# I% ^7 w9 B2 P
4 v) o$ K' P+ Y! B" b+ [bhavesh engineer sales 30000% s1 a5 |% D7 e/ n/ I
rajesh directory sales 400002 B3 m1 T7 z6 u. w) z6 v
niraj clerk account 20000
1 u2 O( W  r4 W  b  D& q, j1 ~jay peon purchase 23000% v, S  E0 S8 K% m6 `  n
deep clerk sales 20000
% i$ s- |$ c' HEOF
. R6 h: O8 u) q! i+ o& V
<以上代码可复制粘贴,可往左滑>
4 h- W" P$ s3 `# \8 J
微信图片_20201023202632.png
删除文件中的所有空白行可以使用awk的特殊变量NF,从文件中删除所有空白行。例如,删除文件content.txt中的所有空白行。
* M6 u" S$ L: Z. W[root@localhost ~]# awk NF content.txt - o# B- T9 e5 ?, x8 I
<以上代码可复制粘贴,可往左滑>

" e2 S* U" g6 f3 C
微信图片_20201023202635.png
删除每行开头或者末尾的空格和制表符
* X/ c, f! d: p# G$ j4 \+ z/ m使用awk命令在文件开头找到一个或多个空格或制表符并删除。可以使用以下命令:
, s0 v* r: N" m4 e; i7 Q0 C3 X& P
[root@localhost ~]# awk '{ sub(/^[ \t]+/, ""); print }' content.txt" E( r% r4 X) l$ Q; S  Y
<以上代码可复制粘贴,可往左滑>
4 W: ?5 |& [" x! ]7 O0 b4 h
微信图片_20201023202638.png

9 _! Y7 d; l* g: n7 n% Z
命令行中的意思是:使用sub函数找到开头是制表符和空格的行,并替换空格和制表符为空。注意:sub()函数替换只发生在第一次匹配的时候,也就是一行中有多个空格或多个制表符,只替换左面的第一个。) u% v" {5 C3 |! |6 W
删除末尾的空格和制表符可以使用下面的命令:0 t; E5 d- `9 {5 R
[root@localhost ~]# awk '{ sub(/[ \t]+$/, ""); print }' content.txt
+ p: C6 G9 F% ?, C
<以上代码可复制粘贴,可往左滑>
6 S: H3 C% X* ^! j/ E4 ?1 `( H
同时查询开头和末尾的空格和制表符,可以使用下面命令:+ V" C0 b5 U' T1 i
[root@localhost ~]# awk '{ gsub(/^[ \t]+|[ \t]+$/, ""); print }' content.txt
' s. t6 _. c# P4 \3 ?; @
<以上代码可复制粘贴,可往左滑>6 _7 M- |  f1 W; t' E9 \# l
gsub函数表示满足条件,替换所有的匹配字符。
* r' U4 R1 E. ]) q2 D
5 R$ \) A1 ^3 \) i8 z

0 r+ g- F; I" i: P倒序列出文件中的所有行
$ a8 C  k9 x% w* x它记录数组中的所有行,并将它们以相反的顺序排列。使用以下命令:
' [9 p( O$ }7 I/ V: y[root@localhost ~]# awk '{ b[i++] = $0 } END { for (j=i-1; j>=0;) print b[j--] }' content.txt
# a& |2 F3 R$ h: v& v) u8 |! p
<以上代码可复制粘贴,可往左滑>
& u; }4 f, Q% `. H# q
微信图片_20201023202641.png
添加行号为每行内容3 }6 X4 a5 V: d. B: Z
使用以下命令使用NF内置变量对非空行进行编号:0 L' R1 r* z) s: h3 c/ c: k
[root@localhost ~]# awk 'NF { $0=++a ": " $0 }; { print }' content.txt ) c+ e7 ^  O/ Y: v$ p' ~, m
<以上代码可复制粘贴,可往左滑>
3 e" F6 w2 y# F% k) t9 x
微信图片_20201023202644.png
打印包含特定字符串的行数
  o% i! W" E$ w5 c- k; ^使用以下命令来打印包含engineer的总行数:0 `$ W9 F3 {8 R" K7 C
[root@localhost ~]# awk '/engineer/{n++}; END {print n+0}'  content.txt% `& S# y+ A+ L
<以上代码可复制粘贴,可往左滑>

3 v# O5 G$ l7 y- _7 i8 P
微信图片_20201023202647.png
打印与指定字符串匹配的行7 T. r. z7 w8 s* W" c% n
下面实例中,筛选出含有 engineer字符串的行:
1 g# Q! W) P" J) u[root@localhost ~]# awk '/engineer/' content.txt * K5 x6 s3 V4 K. e$ S
<以上代码可复制粘贴,可往左滑>
) h$ v, D+ U1 c! z( y" @8 b
微信图片_20201023202651.png
) O: n3 q* a1 Q, O1 j+ j  @2 ]& t
打印与指定字符串不匹配的行: }# T  C2 j2 b; ~
下面实例中,打印不包含字符串 jayesh 的行:, f4 ^( u1 h  s! E% ]: V0 E9 |  H
[root@localhost ~]# awk '!/jayesh/' content.txt
/ T) \# ]* S1 F$ X6 s4 }' ?" C
<以上代码可复制粘贴,可往左滑>

' `, Q' c; W% s& |, {" d
微信图片_20201023202654.png
% s2 n& F! h* P3 Z* Z% S' h
替换字符串5 n3 ^$ i% N4 p: Z: u& B: o
实例一:将content.txt中的字符串“ engineer”替换为“ doctor”,用到gsub()函数:
; L- g, p+ Q9 [/ ~4 _[root@localhost ~]# awk '{gsub(/engineer/,"doctor")}{print}' content.txt ' F. c  L/ o; v+ o  j
<以上代码可复制粘贴,可往左滑>
" g1 h$ o3 Z/ f' x1 n$ R0 E
微信图片_20201023202657.png
5 t9 r' K' u" P, \: _$ A; `, X2 H
实例二:查找字符串“ jayesh”,“ hitesh”或“ bhavesh”,并将其替换为字符串“ mahesh”,运行以下命令:
; g6 j3 C9 I8 F, b( M
[root@localhost ~]# awk '{gsub(/jayesh|hitesh|bhavesh/ , "mahesh"); print}' content.txt
) H2 X# T$ d( q% L4 X
<以上代码可复制粘贴,可往左滑>

: D' L! ^5 _* L
微信图片_20201023202700.png

% d# W8 t4 d# ]
配合df命令,显示磁盘空间" P) p+ A' L1 g! _2 n  x
可以将awk命令与df一起使用,只显示设备名称和可用空间、使用率。
5 m6 {7 m/ k0 J# Z9 |) F9 T$ k[root@localhost ~]# df -h | awk '{printf("%-24s \t %-6s \t %-4s \n",$1,$4,$5)}'+ a9 n3 N7 N) J, r2 ~! @
<以上代码可复制粘贴,可往左滑>

8 E* }3 J% T3 f/ v$ s& |  R2 z( o  S
微信图片_20201023202704.png

& t( s9 M  p! `: S3 ~# j
查看每个IP打开的连接数' t8 v3 e6 Q! A5 F4 C  X, v
如果认为服务器受到攻击,那么这种awk单行代码非常有用。它将显示服务器的打开连接列表,并按数量对它们进行排序。
* O$ ~. Y; f9 J' E( g, T[root@localhost ~]# netstat -ntu|awk '{print $5}'|cut -d: -f1|awk '/[0-9]/'|sort|uniq -c|sort -n
# z" r& ?6 T8 M& z
<以上代码可复制粘贴,可往左滑>  U5 L9 q' X4 Y2 j+ }! v: A9 r1 R

: a' P2 T. @5 q" q9 O; c
微信图片_20201023202707.png
; P1 e5 B. Y6 S+ V! f* A
总    结
+ _- l) U! T% S2 m+ Z* Q( e我们通过实际示例了解如何使用一行awk命令执行日常任务。
& j5 s5 s/ l, i1 I5 |' g5 o$ B) T; J
赞 收藏 评论0 发布时间:2020-10-23 20:29

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版