Arrays 阵列上的Uniq,未正确显示
我是bash编程新手,我正在为数组和如何使用它们而挣扎。 情景: 我有一个叫做x的变量,它由一组IP组成。 这是我从脚本中回显$x时的输出Arrays 阵列上的Uniq,未正确显示,arrays,linux,bash,loops,Arrays,Linux,Bash,Loops,我是bash编程新手,我正在为数组和如何使用它们而挣扎。 情景: 我有一个叫做x的变量,它由一组IP组成。 这是我从脚本中回显$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.5
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
我没有看到这一点,应该很简单,但我找不到解决方案:(
谢谢!非常棒的社区!这里不需要阵列 使用
grep
、sort
和uniq
的简单管道将实现以下功能:
echo "$x" | grep -Eo '[0-9]+(\.[0-9]+){3}' | sort | uniq -c | sort -rn
方法1:
使用
tr
将空格替换为换行符,然后使用sort | uniq-c
:
tr ' ' '\n' <<<"$x" | sort | uniq -c
实际上,您本身没有数组;您有一个由空格分隔的数字字符串。如果
echo$x
给出了您指定的值,则情况就是这样,答案是:
aips=( ${x} )
printf "%s\n" "${aips[@]}" | sort | uniq -c
这会将由空格(IFS
)分隔的数字字符串转换为数组aips
(参数指定这是一个数组,而不是字符串),然后使用printf
,当参数多于格式规范指定的参数时,它会重新使用格式规范,以打印数组的每个元素(${aips[@]}
),后跟一个换行,然后对其进行排序和uniq
s
如果这是一个真正的数组(例如,x=(“182.100.67.59”“201.21.24.22”…)
),答案将是后面的部分:
printf "%s\n" "${x[@]}" | sort | uniq -c
15 182.100.67.59
3 201.21.24.22
4 44.21.25.31
IFS更改shell将记录拆分为字段的方式,但在
排序中,请注意echo$x
对于变量x
实际包含的内容非常缺乏信息。它将所有运行的空格都更改为单个空格(隐藏换行符),将可以解析为glob表达式的任何内容替换为glob标识的文件列表,如果变量是数组,则会自动放弃除第一项以外的所有内容,并且还具有一些其他最可能不需要的行为。最好使用声明-p x
,尽管echo“$x”
总比没有任何改进好。哦,谢谢@charlesdufy,所以问题在于IFS。很高兴知道,你认为解决这个问题的最佳方法是什么?我想表达的是,IFS与此无关(因为没有发生字段拆分,所以控制字段拆分的变量在这里不相关)。注释的目的更多地解释了为什么在设置IFS
后调用sort
的尝试不起作用。鉴于echo$x
显示了所有IP,它显然不是一个数组(或者OP使用的是zsh而不是bash——但是在bash中,$array
只扩展到第一个元素)。@CharlesDuffy说得好,我回答了标题中的问题,而不是问题中的详细问题。我将更新我的答案。注意aips=(${x})
is——它不仅在IFS上将项目拆分为一个数组,还扩展内容中的glob,并相应地受制于shell的各种glob相关配置(nullglob
,failglob
,等等)。read-r-aaips(完整性警告:如果一个变量可能有多行,则可能需要read-r-d'-a API<
aips=( ${x} )
printf "%s\n" "${aips[@]}" | sort | uniq -c
printf "%s\n" "${x[@]}" | sort | uniq -c
15 182.100.67.59
3 201.21.24.22
4 44.21.25.31