如何计算包含两个变量的目录文件,然后将它们放入一个命令中的一个文本文件中

如何计算包含两个变量的目录文件,然后将它们放入一个命令中的一个文本文件中

我需要以下方面的帮助;

a) 编写一个创建文件的命令,其中该文件包含 TCP 和 UDP 的参数数量。计数中不应包含其他协议(例如 IP 或 XFRM)的参数。

这些参数在 /proc/sys/net/ipv4/ 中的各个文件中设置,其中协议(TCP 或 UDP)由文件名中的前几个字母确定。一条线)。

单个命令可以使用管道和重定向,但不能简单地组合命令(例如使用;)。前几行内容的示例为:
63 tcp
3 udp

这是我到目前为止所拥有的:

ls -l /proc/sys/net/ipv4 | grep -n "tcp\|udp"| cut -d " " -f 10| cut -c 1-3 

答案1

在这种情况下,我不会尝试使用管道或重定向来计算文件数,而是让 shell 为我做这件事:

$ set -- /proc/sys/net/ipv4/tcp*
$ printf '%d tcp\n' "$#"
73 tcp
$ set -- /proc/sys/net/ipv4/udp*
$ printf '%d udp\n' "$#"
5 udp

或者,写入输出文件:

{ set -- /proc/sys/net/ipv4/tcp*; printf '%d tcp\n' "$#"
  set -- /proc/sys/net/ipv4/udp*; printf '%d udp\n' "$#"; } >outputfile

您可以人为地将其转换为单个复合命令,但没有人会编写这样的代码:

$ set -- /proc/sys/net/ipv4/tcp* && printf '%d tcp\n' "$#" && set -- /proc/sys/net/ipv4/udp* && printf '%d udp\n' "$#"
73 tcp
5 udp

在这两组命令中,通过扩展文件名通配模式、将位置参数设置为扩展的路径名列表,然后简单地输出列表中的元素数量来对文件进行计数。

如果任一模式不匹配任何内容(1 而不是 0),您将得到错误的计数。您可以通过设置nullglob中的 shell 选项来纠正此问题bash

这恰好也涵盖了文件名包含换行符和任何其他奇怪字符的理论极端情况。


执行与上面相同操作的命令(即计算以和awk开头的文件名出现的次数):tcpudp

awk '
    BEGIN {
        for (i=1;i<ARGC;++i) { sub(".*/","",ARGV[i]); sub("_.*","",ARGV[i]); c[ARGV[i]]++ }
        for (i in c) print i, c[i]
    }' /proc/sys/net/ipv4/{tcp,udp}*

答案2

您不需要该-l选项,因为您对权限、所有权和大小等文件详细信息不感兴趣。只需要文件名。

grep命令不起作用。grep无论如何都无济于事,因为问题要求您分别计算 tcp 和 udp 文件。

要对文件进行计数,您可以使用ls|wc -l.要计算名称以“tcp”开头的文件:ls tcp*|wc -l.对“udp”执行相同的操作,并将两个数字合并在一个 echo 中:

echo -e "$(ls /proc/sys/net/ipv4/tcp*|wc -l) tcp\n$(ls /proc/sys/net/ipv4/udp*|wc -l) udp" > out

需要-e处理换行符。

如果文件名包含换行符,这将不起作用,但我们可以放心地假设 /proc/sys/net/ipv4 中不是这种情况。

重新阅读问题后,我不确定我的答案是否正确。它仅对文件进行计数,而不对参数进行计数。我现在需要做出一个假设:参数是这样一个文件中的一个单词。大多数文件只包含一个单词,但有些文件包含更多单词。要计算字数,请使用wc -w.代替ls,使用cat来访问文件内容:

echo -e "$(cat /proc/sys/net/ipv4/tcp*|wc -w) tcp\n$(cat /proc/sys/net/ipv4/udp*|wc -w) udp" > out

答案3

您的示例中所缺少的就是将其通过管道传输为uniq -c如下所示:

ls -l /proc/sys/net/ipv4 | grep -n "tcp\|udp"| cut -d " " -f 10| cut -c 1-3 | uniq -c

这是我在我的系统上运行它时得到的结果:

$ ls -l /proc/sys/net/ipv4 | grep -n "tcp\|udp"| cut -d " " -f 10| cut -c 1-3 | uniq -c
     68 tcp
      5 udp

答案4

我想出的解决方案如下;

ls /proc/sys/net/ipv4 | grep "tcp\|udp" | cut -d "_" -f1 |sort |uniq -c > output.txt

感谢大家的帮助:)

相关内容