【问题标题】:Count and sort commands used in history历史中使用的计数和排序命令
【发布时间】:2015-07-07 00:35:52
【问题描述】:

我有一个包含一堆命令的文本文件,例如:

ls -l
/bin/bash/
cat file.txt
bash
cat somethingElse

我要做的是,获取命令的名称(lscatbash)并计算它们。我已经这样做了:

cut -d' ' -f1 file.txt | tr ' ' '\n' | sort | uniq -c

这几乎可以像我想的那样工作——输出是:

1 bash
1 /bin/bash
2 cat
1 ls

这里唯一的问题是,它必须 IGNORE ABSOLUTE 路径,所以输出必须是这样的

2 bash
2 cat
1 cat

我尝试了一个带有 if 语句的 while 循环,它检查一行中是否有“/”,但它似乎不起作用。

【问题讨论】:

    标签: bash cut


    【解决方案1】:

    使用awk,您可以说print $1 来打印第一个单词。但是,您只需要名称。为此,您可以使用basename

    $ basename "/bin/bash"
    bash
    

    然后就是从awk 调用basename 的问题。一起来:

    $ awk '{system("basename "$1)}' a
    ls
    bash
    cat
    bash
    cat
    

    然后您可以通过管道发送到sortuniq

    $ awk '{system("basename "$1)}' a | sort | uniq -c
          2 bash
          2 cat
          1 ls
    

    【讨论】:

    • 谢谢您,按预期工作!有没有办法“重新制作”你的命令,所以它也将管道作为命令的一部分?假设有一行包含: cat file.txt |排序 | uniq -c,它还会把sort和uniq算作cmd中统计和打印的命令吗?
    • 嗯,也许你应该事先用新线替换管道:tr '|' '\n' < file
    • awk '{system("basename "$1)}' "${@: -1}" | tr'|' '\n'
    • 不..该死的教授..我设法用cut做到了,但排序有问题。
    猜你喜欢
    • 1970-01-01
    • 2011-08-09
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多