【发布时间】:2021-03-18 18:18:31
【问题描述】:
我是 bash 编程的新手,我正在为数组以及如何使用它们而苦苦挣扎。 场景:
我有一个名为 x 的变量,它由一组 IP 组成。 这是我从脚本中 echo $x 时的输出
182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 201.21.24.22 201.21.24.22 201.21.24.22
44.21.25.31 44.21.25.31 44.21.25.31 44.21.25.31
然后,我想知道每个 IP 重复了多少次。 期望的输出是:
15 182.100.67.59
4 44.21.25.31
3 201.21.24.22
我已经尝试了以下
(IFS=" "; sort <<< "$x" ) | uniq -c
输出 注意输出中的第一个 1。
**1** 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 201.21.24.22 201.21.24.22 201.21.24.22 44.21.25.31 44.21.25.31 44.21.25.31 44.21.25.31
我没有看到这个,应该很简单,但我找不到解决方案:( 谢谢!还有非常棒的社区!
【问题讨论】:
-
IFS 改变了 shell 将记录拆分为字段的方式,但在
sort <<< "$x"中根本没有将记录拆分为字段;整个变量按原样在sort(这是一个单独的程序,不是外壳的一部分)的标准输入上传递,外壳没有以任何方式改变它。 -
另请注意,
echo $x对您的变量x实际包含的内容非常缺乏信息。它将所有空格的运行更改为每个空格(隐藏换行符),将任何可以解析为 glob 表达式的内容替换为 glob 标识的文件列表,如果您的变量是数组,则静默丢弃除第一项之外的所有内容,并且还有一些其他最可能不需要的行为。最好使用declare -p x,尽管echo "$x"总比没有改进要好。 -
哦,谢谢@CharlesDuffy,所以问题出在 IFS 上。很高兴知道,您认为解决此问题的最佳方法是什么?
-
我的意思更多的是 IFS 与它没有任何关系(因为没有发生字段拆分,控制字段拆分的变量在这里不相关)。评论的目的更多是为了解释为什么在设置
IFS后调用sort的尝试不起作用。