在 Linux 上查找我最常用的命令

我是自动化的支持者,所以当我发现自己一遍又一遍地运行相同的命令时,我总是寻找一种将其包装在别名或脚本中的方法。

我在命令行上花了很多日常工作,今天我意识到我必须第 100 万次输入“git status”,并想知道我最常用的命令是什么。所以我找到了一个堆栈溢出帖子,在一个漂亮的小 bash one liner 中显示了我最常用的命令。

history | awk '{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl |  head -n10

此命令从 bash 历史记录中提取信息并向我显示我运行的根命令。这在我当前的系统上向我展示了以下内容。

     1	6865  68.3901%     git

     2 761   7.58119%     cd

     3 441   4.39331%     ll

     4 425   4.23391%     vagrant

     5 275   2.73959%     composer

     6 149   1.48436%     ssh

     7 146   1.45447%     exit

     8 128   1.27515%     rm

     9 73    0.727237%    sudo

    10 72    0.717274%    mv

看起来我在运行的近 70% 的命令中都使用了 git。如果没有看到我实际运行的 git 命令,这很有趣但毫无意义。我决定深入研究这些数据,找出我运行最多的命令,也许是按照特定的顺序,试图尝试自动化一些步骤。

为了查看我最近运行的实际命令,我创建了一个小的 PHP 脚本,它将历史命令作为输入并查找最常用的运行命令。由于 history 命令的输出有以数字开头的行,因此需要首先从每一行中删除这些行。之后,只是构建一个命令数组作为索引数组的键,然后计算该命令在历史记录中出现的次数。

$stdin = fopen('php://stdin', 'r');

 

$commands = [];

 

 

while (false !== ($line = fgets($stdin))) {

  if (strlen($line) > 300) {

    // 防止计算长命令。

    continue;

  }

  $command = preg_replace('/(\d+\*?\s{1,2})/', '', trim($line));

  if (!isset($commands[$command])) {

    $commands[$command] = 1;

  }

  else {

    $commands[$command]++;

  }

}

 

arsort($commands);

 

print_r(array_slice($commands, 0, 25));

为了运行它,我只是将 history 命令的输出通过管道传输到脚本中。使用 php://stdin 运行该命令的输出如下。

$ history | php history-report.php

Array

(

    [git status] => 1527

    [ll] => 468

    [cd ..] => 314

    [git log] => 250

    [exit] => 158

    [vagrant up] => 140

    [cd vm] => 137

    [git checkout stage] => 136

    [vagrant halt] => 125

    [git pull origin stage] => 111

    [vagrant ssh] => 106

    [git checkout master] => 92

    [git checkout prod] => 87

    [git diff] => 78

    [git checkout dev] => 78

    [git pull origin prod] => 73

    [git pull origin master] => 70

    [git checkout integration] => 69

    [git merge stage] => 66

    [git reset HEAD --hard] => 60

    [git pull origin dev] => 57

    [git merge dev] => 57

    [git checkout preprod] => 55

    [git pull origin integration] => 55

    [git commit] => 49

)

看起来我运行 'git status' 的次数比其他 git 命令要多得多。查看我已安装的别名,我意识到我可以使用 Oh My Zsh 别名“gst”来缩短它,我现在需要记住使用它。我确定我只是使用肌肉记忆输入“git status”并且已经习惯了输入。除了 git 之外,我还经常使用 vagrant,但也会在其中看到一些文件系统导航命令。

深入挖掘一下,我决定看看我运行了哪些命令,以便更好地了解我倾向于重复的事物类型。这意味着稍微调整上面的脚本,以便我找出我一个接一个运行的命令。

$stdin = fopen('php://stdin', 'r');

 

$commands = [];

 

$adjacentCommands = [];

 

// 提取命令。

while (false !== ($line = fgets($stdin))) {

  if (strlen($line) > 300) {

    continue;

  }

  $command = preg_replace('/(\d+\*?\s{1,2})/', '', trim($line));

  $commands[] = $command;

}

 

// 查找并发命令。

foreach ($commands as $id => $command) {

  for ($i = 2; $i <= 5; $i++) {

    if (isset($commands[$id - $i])) {

      $key = implode(' && ', array_slice($commands, $id - $i, $i));

      if (!isset($adjacentCommands[$i][$key])) {

        $adjacentCommands[$i][$key] = 1;

      }

      else {

        $adjacentCommands[$i][$key]++;

      }

    }

  }

}

 

// 打印报告。

foreach ($adjacentCommands as $number => $adjacentCommand) {

  echo 'NUMNER:' . $number . PHP_EOL;

  arsort($adjacentCommand);

  print_r(array_slice($adjacentCommand, 0, 10));

}

在玩过按顺序运行的命令数量后,我发现 5 似乎是一个不错的数字,不止于此,它会产生很多我只运行过一次的命令序列,这对我来说没有多大意义自动化。我使用“&&”将命令串在一起,因为这意味着如果需要,命令序列实际上可以按原样使用。

虽然这里有相当多的输出,但我需要删除其中的一些,因为有一些命令序列会进入客户端工作,我不能在这里重复。这是我可以显示的输出。

$ history | php history-report.php

Number: 2

Array

(

    [cd .. && ll] => 107

    [git checkout stage && git pull origin stage] => 100

    [git status && git log] => 75

    [cd vm && vagrant up] => 72

    [vagrant halt && cd ..] => 67

    [ll && cd ..] => 55

    [vagrant up && vagrant ssh] => 54

    [git checkout integration && git pull origin integration] => 53

    [git status && git diff] => 53

    [git reset HEAD --hard && git status] => 50

)

 

Number: 3

Array

(

    [ll && cd .. && ll] => 31

    [cd vm && vagrant up && vagrant ssh] => 29

    [git status && git reset HEAD --hard && git status] => 28

    [exit && vagrant halt && cd ..] => 22

    [git status && git addcomposer.json&& git add composer.lock] => 19

    [cd .. && ll && cd ..] => 19

    [vagrant halt && cd .. && ll] => 18

    [vagrant up && vagrant ssh && vagrant halt] => 16

    [vagrant ssh && vagrant halt && cd ..] => 16

    [ll && cd var && ll] => 16

)

 

Number: 4

Array

(

    [cd vm && vagrant up && vagrant ssh && vagrant halt] => 10

    [vagrant halt && cd .. && ll && cd ..] => 9

    [vagrant up && vagrant ssh && vagrant halt && cd ..] => 8

    [cd .. && ll && cd .. && ll] => 8

    [cd vm && ll && cd var && ll] => 7

    [cd vm && vagrant up && vagrant ssh && cd ..] => 7

    [git status && git addcomposer.json&& git addcomposer.lock&& git add vendor/] => 6

    [git status && git addcomposer.json&& git addcomposer.lock&& git status] => 6

    [git checkout prod && git pull origin prod && cd vm && vagrant up] => 6

    [ll && cd vm && ll && cd var] => 5

)

 

Number: 5

Array

(

    [cd vm && vagrant up && vagrant ssh && vagrant halt && cd ..] => 6

    [ll && cd vm && ll && cd var && ll] => 5

    [git status && git reset HEAD && git status && git reset HEAD --hard && git status] => 4

    [vagrant halt && cd .. && ll && cd .. && ll] => 4

    [cd .. && ll && cd .. && cd www && ll] => 3

    [exit && vagrant halt && cd .. && ll && cd ..] => 3

    [cd someproject && git checkout prod && git pull origin prod && cd vm && vagrant up] => 3

    [cd vm && vagrant up && vagrant ssh && git status && cd ..] => 3

)

很明显,我是个白痴。数据就在那里。我运行了多少次 'cd something' 然后是 'll'?嗯,这个数字确实存在,所以至少有 107 次。使用它,我还可以看到我倾向于使用“git status”作为支撑,以确保在运行某种破坏性命令之前和之后我的 git repo 的状态。

撇开悲观情绪不谈,我可以看到这里可以节省一些时间。我倾向于运行命令来结账,然后更新 git 分支很多,所以自动化这将是节省我一些输入的第一步。除此之外,我还可以通过在每次目录更改后运行目录列表来节省一些输入。碰巧我已经写过关于在过去更改目录后列出目录内容的内容,因此我将尽快将其添加到我的 bash 配置文件中。

你的结果是什么?您一遍又一遍地运行相同的命令序列多少次?在下面发表评论,让我知道我并不孤单!

以上是 在 Linux 上查找我最常用的命令 的全部内容, 来源链接: utcz.com/z/343784.html

回到顶部