so true

          心懷未來,開創未來!
          隨筆 - 160, 文章 - 0, 評論 - 40, 引用 - 0
          數據加載中……

          Linux下修改后的ps命令,很好很強大!

          今天在linux下寫了個小程序,功能是:利用ps來查找包含當前字符串的所有命令,有時候會得到很多搜索結果,而且由于每個命令附帶的參數很長,導致很亂很難以分清楚,下面這個程序會將匹配得到的結果每隔一行輸出,而且搜索詞會以紅色加粗顯示,并且搜索結果會被兩條彩色線條分隔出來,該彩色線條的顏色和線型也都是隨機變換的,這么做的目的是為了防止在一屏內的兩次結果的四條線之間混亂,用不同顏色和線型加以區分會非常清晰明了,而且該彩色線條的長度是與你的終端寬度相匹配的;后續又改進了一下,比如你搜索mps Sh,那么可以為你搜索出mps SH;mps sh; mps sH; mps Sh四種結果的并集。

          先看一下shell版本的:
          #!/bin/bash

          if [ "$#" -ne "1" ];then
              echo "Usage: my <SearchWord>"
              exit 1
          fi

          COLORTYPE=$((32+RANDOM%5))
          lineArray=('=' '-' '#' '%' '~' '/')
          LINETYPE=${lineArray[$((RANDOM%6))]}

          echo -e "\033[1;${COLORTYPE}m`python -c "print ""'"${LINETYPE}"'"*$(echo  $(stty size) | cut -d' ' -f2)`\033[0m"
          echo
          ps aux | grep -i $1 | awk "!/grep/&&!/mps.*$1/&&!/sed.*$1.*1;31m.*g/{print \$0 \"\n\" }" | sed -e "s/\($1\)/$(echo -e '\033')\[1;31m\1$(echo -e '\033')\[0m/gi"
          #需要說明的是,上面的$(echo -e '\033')完全可以由字符^[,注意這是一個字符,表示Esc那個鍵,在vi里可以通過Ctrl+v,然后再按Esc來輸入該特殊字符;這里用echo這么惡心的做法只是因為我如果寫^[這個字符,怕誤導大家以為是兩個字符,因此給出了一個通用的,不會有歧義的,但是也很丑陋的做法
          echo -e "\033[1;${COLORTYPE}m`python -c "print ""'"${LINETYPE}"'"*$(echo  $(stty size) | cut -d' ' -f2)`\033[0m"

          再給出c++版本的(其實上面的shell版本已經足夠了,不過當初我沒把shell實現的那么完整,后來才發現原來shell都可以實現之,因此下面的 c++版本純粹是為了自我留念之用,大家可以不必看了,呵呵):
          #include <termio.h>
          #include <stdlib.h>
          #include <iostream>
          #include <sstream>
          #include <string>
          #include <time.h>

          using namespace std;

          enum Color
          {
              GREEN = 32,
              YELLOW = 33,
              BLUE = 34,
              MAUVE = 35,
              CYANINE = 36
          };

          enum LineStyle
          {
              EQUAL = (uint32_t) '=',
              TILDE = (uint32_t) '~',
              ASTERISK = (uint32_t) '*',
              MINUS = (uint32_t) '-',
              POUND = (uint32_t) '#',
              SLASH = (uint32_t) '/'
          };

          uint32_t ChooseColor()
          {
              srand(static_cast<unsigned>(time(0)));

              switch(rand()%5)
              {
              case 0:
                  return GREEN;
                  break;
              case 1:
                  return YELLOW;
                  break;
              case 2:
                  return BLUE;
                  break;
              case 3:
                  return MAUVE;
                  break;
              default:
                  return CYANINE;
                  break;
              }

              return GREEN;
          }

          uint32_t ChooseLineStyle()
          {
              srand(static_cast<unsigned>(time(0)));

              switch(rand()%6)
              {
              case 0:
                  return EQUAL;
                  break;
              case 1:
                  return TILDE;
                  break;
              case 2:
                  return ASTERISK;
                  break;
              case 3:
                  return MINUS;
                  break;
              case 4:
                  return POUND;
                  break;
              default:
                  return SLASH;
                  break;
              }

              return EQUAL;
          }

          int main(int argc, char* argv[])
          {
              if (2 != argc)
              {
                  cout << "Usage: mps <SearchWord>" << endl;
                  return 1;
              }

              struct winsize wsz;
              ioctl(STDOUT_FILENO, TIOCGWINSZ, (char*) &wsz);

              stringstream seperatorLine;
              seperatorLine << "echo """ << (char)27 << "[1;" << ChooseColor() << 'm'
              << string("").append(wsz.ws_col, (char)ChooseLineStyle()) << char(27) << "[0m""";

              char psCommand[1024] = {0};
              sprintf(psCommand,"ps aux | grep %s | grep -v grep | grep -v 'mps.*%s' | grep -v 'sed.*%s.*""[1;31m%s.*g' | "
                          "awk '{print $0 """"n""}' | sed ""s/%s/%c""[1;31m%s%c""[0m/g""",
                          argv[1], argv[1], argv[1], argv[1], argv[1], (char)27, argv[1], (char)27);

              system(seperatorLine.str().c_str());
              system("echo");
              system(psCommand);
              system(seperatorLine.str().c_str());

              return 0;
          }

          最后給出使用方法,不論是shell版本的還是binary版本的,都需要其有可執行權限,我是將其拷貝到/usr/bin目錄下了,這樣大家就都可以使用該程序了:mps vmware即可; 后來又想到更簡單的辦法,直接在.bashrc中定義個函數叫mps即可,把上面的shell代碼copy到函數體里面(將exit 1換為return)就ok了。

          posted on 2009-06-13 03:34 so true 閱讀(1259) 評論(0)  編輯  收藏 所屬分類: C&C++ 、Linux

          主站蜘蛛池模板: 贵南县| 莲花县| 青神县| 工布江达县| 高安市| 儋州市| 柳林县| 驻马店市| 华坪县| 尼勒克县| 秀山| 厦门市| SHOW| 东乡族自治县| 双江| 井研县| 原平市| 福贡县| 湖口县| 阿合奇县| 商河县| 吴堡县| 普陀区| 揭东县| 离岛区| 呼玛县| 永嘉县| 三穗县| 青川县| 吉隆县| 措勤县| 湘西| 岐山县| 宜君县| 瓮安县| 天柱县| 淅川县| 垣曲县| 赫章县| 武冈市| 池州市|