【问题标题】:Searching for "/" using awk使用 awk 搜索“/”
【发布时间】:2013-01-08 01:40:27
【问题描述】:

我想在以下df输出中搜索Mounted on下的/

Filesystem     1K-blocks     Used Available Use% Mounted on
/dev/sda1      471081708 82857660 364294432  19% /
udev             2046164        4   2046160   1% /dev
tmpfs             822540     1376    821164   1% /run
none                5120        0      5120   0% /run/lock
none             2056344      388   2055956   1% /run/shm
/dev/sdb1      228917696 21117560 195590336  10% /media/xtra

但是,这个命令

df | awk -F" " /\// '{print $6 "\t" $4}'

导致此错误

awk: cmd. line:1: ///
awk: cmd. line:1:    ^ unexpected newline or end of string

如何在Mounted on 下搜索/

【问题讨论】:

  • 由于除了 te 之外的每一行都包含一个“/”,那么您通过搜索“/”究竟想要完成什么?如果只是跳过第一行,NR>1 的解决方案更明显
  • 我正在尝试获取最后一个“/”,您提出了一个很好的观点。我可能会得到第 2 行。
  • 您将获得所有已发布的解决方案。 the last "/" 是什么意思?每行的最后一行还是最后出现的“/”?请发布您的示例输入的预期输出,以免我们猜测。

标签: awk


【解决方案1】:

您的模式在引号之外:

$ df | awk '/\//{print $6 "\t" $4}'

您还可以在脚本开头指定输出字段分隔符:

$ df | awk 'BEGIN{OFS="\t"}/\//{print $6, $4}'

$ df | awk -v OFS="\t" '/\//{print $6, $4}'

但正如EdMorton 指出的那样,每一行的标题旁边至少有一个/,因此您可以放弃匹配并跳过第一行,例如:

$ df | awk 'NR>1{print $6 "\t" $4}'

【讨论】:

  • 或者,IOW,模式需要是与匹配相同的参数的一部分。
  • 对使用 BEGIN 进行更改...使用打印字符串中的文字选项卡会更好。
  • @JonathanLeffler 除了风格之外的任何原因,毕竟这就是OFS 的用途。
  • 也许 -v OFS='\t' 更可口?无论哪种方式....由于每一行都有一个“/”但标题我真的不明白OP试图通过搜索“/”来做什么。
  • 我认为清晰(其次是简洁)使第一个更好。
【解决方案2】:

您的模式并没有真正意义,因为您的 df 输出的每一行总是包含一个/。 (除了标题)

如果您想将输出重新格式化为$6\t$4

df|awk '{print $6"\t"$4}'

如果你的模式只是为了跳过标题,你可以:

 df|awk 'NR>1{print $6"\t"$4}'

如果您只想准确搜索/(根分区):

df|awk '$6~/^\/$/{print $6"\t"$4}'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-26
    • 2016-07-28
    • 2014-06-09
    • 1970-01-01
    • 2014-08-07
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多