so true

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

          Linux學習菁華

          @import url(http://www.aygfsteel.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css); gdb中顯示長字符串:

          1.       Gdb中可以調用printf做格式化打印:

          printf "%.2000s",s

          x /3uc 0x2341234 #打印地址0x2341234開始的3個單元,每個單元1個byte長,以unsigned int類型顯示出來
          p /t 23423 #以二進制形式打印23423
          2000表示最多打印2000個字符。如果需要打印更長的字符,可以增大該數據。

          break write if $rdi == 2 #如果stderr上有輸出的話,就會break, 引自:https://blogs.oracle.com/ksplice/entry/8_gdb_tricks_you_should

           

          2.       Gdb可以將交互輸出到文件。需要調用如下兩個命令:

          set logging on

          set logging file xxx.txt

          以上兩個命令配合可以起到將長字符串打印到文件的作用。

          但是如果字符串中有若干不可見字符,就不能使用這種方法了。這時候我們需要把數據 dump到文件中。命令如下:

          dump binary memory s.txt s s+1000

           s是一個字符串指針,表示dump的起始位置,s+1000表示dump的末尾。S.txt表示結果
          dump的文件名具體的參數意義可以看gdbmannual


          3.打印東西的長度設置項為

          (gdb) set print elements

          (gdb) set print elements 0

          為全部打出。
          3.1 所有打印的控制都是通過set print來進行的,例如set print pretty on,如果打開printf pretty這個選項,那么當GDB顯示結構體時會比較漂亮。

          4. 對于內存版本的字符串,比如char buffer[1000],可以p buffer@300表示從300后開始打印

          gdb能調試,pstack能打印堆棧信息,core dump文件里有堆棧信息,以及運行時變量的值信息,這些都歸功于symbol table,symbole不光是指變量,也包括函數以及文件名等等,沒有symbol table上述的一切都不可能。gdb里可以通過symbole-file命令來加載一個symbol文件,它可以是可執行的程序,也可以是僅僅含有symbol的文件,舉個例子來說:你把strip test -o test.stripped之后的test.stripped文件給別人去用,一旦core掉了,那個人把core文件給你,你可以用gdb test.stripped core來調試,并通過symbol-file test這個命令來加載symbol table,這樣依然可以正常debug。 當然你也可以只保留test里面的symbol table,通過strip --only-keep-debug test -o test.dbg來生成這個文件,然后gdb test.stripped core,通過symbol-file test.dbg就可以了。
          在這里也提一下生成core文件,調用exit(1)是退出,調用abort()是會產生core文件的(當然要ulimit -c unlimited)。

           

          pbt () {
              yes | gdb -p $1 --eval-command='thread apply all bt full' --eval-command='q'
          }

          bt #查看堆棧信息
          bt full #查看堆棧信息,并同時打印local變量
          f 2 #切換到當前堆棧的第2層
          info locals #查看當前的臨時變量
          info thread #查看目前所有的線程
          thread 2 #切換到2號線程
          break file.c:100 thread 3 #只在3號線程設置斷點
          set scheduler-locking on #只調試當前線程,即不會在調試過程中被其他線程切進來
          info macro DEBUG 你可以查看DEBUG這個宏在哪些文件里被引用了,以及宏定義是什么樣的。 macro DEBUG 你可以查看DEBUG宏展開的樣子;但需要在GCC編譯程序的時候,加上-ggdb3參數,這樣,你就可以調試宏了。
           
          info source可以看到當前運行位置對應的源文件信息;
          info sources可以看到當前運行程序所有的源文件列表;
          info frame可以看到當前運行位置的rip,args位置,棧(存放臨時變量)開始位置

          (gdb) set $idx = 0
          (gdb) p a[$idx++]  #然后就可以一路回車下去了,哈哈
          有時候需要打印一個范圍內的變量值,可以這樣搞:
          while $idx < upper_limit
          p a[$idx++]
          end
          設置條件斷點:b 234 if page == 48
          修改變量的值,用set var a=3,也可以用p a=3

          x/x 以十六進制輸出 x/d 以十進制輸出 x/c 以單字符輸出 x/i  反匯編 – 通常,我們會使用 x/10i $ip-20 來查看當前的匯編($ip是指令寄存器)x/s 以字符串輸出 bt #查看堆棧信息
          bt full #查看堆棧信息,并同時打印local變量
          f 2 #切換到當前堆棧的第2層
          info locals #查看當前的臨時變量
          info thread #查看目前所有的線程
          thread 2 #切換到2號線程
          break file.c:100 thread 3 #只在3號線程設置斷點
          set scheduler-locking on #只調試當前線程,即不會在調試過程中被其他線程切進來
          info macro DEBUG 你可以查看DEBUG這個宏在哪些文件里被引用了,以及宏定義是什么樣的。 macro DEBUG 你可以查看DEBUG宏展開的樣子;但需要在GCC編譯程序的時候,加上-ggdb3參數,這樣,你就可以調試宏了。
             
          (gdb) set $idx = 0
          (gdb) p a[$idx++]  #然后就可以一路回車下去了,哈哈

          gdb -c core.2234 //可以從打印到屏幕上的信息的最后部分看到產生這個core文件的命令包括參數
          gdb a.out core.2234 //可以查看bt信息,也可以看到產生core文件的命令和參數,然后運行set args XXXX就可以設定參數了,然后run就可以重新跑起來,可以在core之前設定breakpoints,當運行到要產生core的那一行(例如是38行),可以用jump 39來跳過該行的執行,這么調試的好處在于可以隨時print 一個函數的運行結果,例如print obj.do(),而程序沒有正在運行時,是無法print一個函數的執行結果的.

          gdb里查看源代碼需要增加額外路徑:
          (gdb) show directories 
          Source directories searched: $cdir:$cwd
          (gdb) directory //這個命令會清空所有路徑,最好別這么干
          (gdb) directory XXX/XXX //這個命令會增加一個搜索的路徑
          gdb查看指針類型時,如果是基類指針,希望看到到底是哪個子類時,使用:
          (gdb) set print object //這個命令可以讓print一個基類指針時,可以看到其到底是哪個子類指針
          gdb查看一個變量的類型,簡單點可以用whatis,如果要查看其完整的聲明,用ptype,如果只想看里面的成員變量,用p *XXX;
          gdb里調用函數,需要程序當前在run才行,例如p str.length();對于std::string類型,調試core文件時用下面命令查看里面的內容:
          printf "String \t\t\t= \"%s\"\n", $arg0._M_dataplus._M_p
          printf "String size/length \t= %u\n", (((std::string::_Rep*) ($arg0._M_dataplus._M_p))[-1])._M_length
          printf "String capacity \t= %u\n", (((std::string::_Rep*) ($arg0._M_dataplus._M_p))[-1])._M_capacity
          printf "String ref-count \t= %d\n", (((std::string::_Rep*) ($arg0._M_dataplus._M_p))[-1])._M_refcount
          完整的.gdbinit文件請參見另外一篇帖子http://www.aygfsteel.com/bacoo/archive/2012/11/07/390979.html

          x/x 以十六進制輸出 x/d 以十進制輸出 x/c 以單字符輸出 x/i  反匯編 – 通常,我們會使用 x/10i $ip-20 來查看當前的匯編($ip是指令寄存器)x/s 以字符串輸出

          如果需要調試stl里面的東西,即可以step into libstdc++中,在ubuntu下的方法如下:
          1。安裝libgcc1-dbg和libstdc++6-4.4-dbg;安裝完之后會發現在/usr/lib/debug/下多了些東西:lib  libstdc++.a  libstdc++.so  libstdc++.so.6  libstdc++.so.6.0.13
          2。$ gdb --quiet test
          (gdb) start
          Temporary breakpoint 1 at 0x8048977: file t5.cpp, line 14.
          Starting program: /home/bacoo/test
          [Thread debugging using libthread_db enabled]

          Temporary breakpoint 1, main (argc=1, argv=0xbfffed64) at t5.cpp:14
          14          size_t pos, begin_pos = 0;
          (gdb) info sharedlibrary
          From        To          Syms Read   Shared Object Library
          0x00110830  0x001277af  Yes (*)     /lib/ld-linux.so.2
          0x00133610  0x0013fad8  Yes (*)     /lib/libpthread.so.0
          0x0018d2e0  0x001fecd8  Yes (*)     /usr/lib/libstdc++.so.6
          0x002374b0  0x002517f8  Yes (*)     /lib/libm.so.6
          0x0025bf50  0x00272438  Yes         /lib/libgcc_s.so.1
          0x0028cac0  0x00396a74  Yes (*)     /lib/libc.so.6
          (*): Shared library is missing debugging information.
          (gdb) show debug-file-directory
          The directory where separate debug symbols are searched for is "/usr/lib/debug".
          (gdb)
          注意,上面的libgcc_s.so.1和libstdc++.so.6兩個lib,其中libgcc已經有symbol了,而libstdc++還沒有symbol(這個是根據Yes之后是否有(*)看出來的),
          如果是這種情況的話,那退出gdb,然后執行:
          $ LD_LIBRARY_PATH=/usr/lib/debug gdb --quiet test
          (gdb) start
          Temporary breakpoint 1 at 0x8048977: file t5.cpp, line 14.
          Starting program: /home/bacoo/test
          [Thread debugging using libthread_db enabled]

          Temporary breakpoint 1, main (argc=1, argv=0xbfffed44) at t5.cpp:14
          14          size_t pos, begin_pos = 0;
          (gdb) info sharedlibrary
          From        To          Syms Read   Shared Object Library
          0x00110830  0x001277af  Yes (*)     /lib/ld-linux.so.2
          0x00133610  0x0013fad8  Yes (*)     /lib/libpthread.so.0
          0x001913a0  0x00212b58  Yes         /usr/lib/debug/libstdc++.so.6
          0x0024c4b0  0x002667f8  Yes (*)     /lib/libm.so.6
          0x00270f50  0x00287438  Yes         /lib/libgcc_s.so.1
          0x002a1ac0  0x003aba74  Yes (*)     /lib/libc.so.6
          (*): Shared library is missing debugging information.
          (gdb)
          哈哈,libstdc++也有了symbol了,這樣就可以設置斷點,然后step into就可以跟蹤到stl的內部了。

          ============================================
          linux下用vpn,安裝openconnect這個包,
          sudo /usr/bin/openconnect --script=/etc/vpnc/vpnc-script Your-Vpn-Server-Address
          ============================================
          > cat close.gdb
          p close(1)
          p close(2)
          #p dup2(open("/dev/null",0),1) #another way to close stdout
          #p dup2(open("/dev/null",0),2) #another way to close stderr
          #p open("/dev/pts/4", 1)     #redirect stdout to another tty
          #p open("/tmp/myerrlog", 1)  #redirect stdout to another file
          detach
          q
          > gdb -p 3465 -x close.gdb

          如果希望每次程序中斷后可以看到即將被執行的下一條匯編指令,可以使用命令
          "display /i $pc"
          其中 $pc 代表當前匯編指令,/i 表示以十六進行顯示。當需要關心匯編代碼時,此命令相當有用。
          undispaly,取消先前的display設置,編號從1開始遞增。
          b *main”在 main 函數的 prolog 代碼處設置斷點(prolog、epilog,分別表示編譯器在每個函數的開頭和結尾自行插入的代碼)
          info registers #查看所有寄存器變量
          info registers rax #查看寄存器rax的值
          p $rax #查看寄存器rax的值
          disassemble #查看匯編代碼
          set disassembly-flavor intel # 設置反匯編格式
          x/1uw $rbp-0x8 #查看某個內存地址里的值
          info proc mappings #查看進程地址空間中各塊內存的分配
          set follow-fork-mode child #調試子進程
          layout src #使用tui(Text User Interface),打開src和cmd兩個窗口
          layout split #使用tui,打開src,assemble,cmd三個窗口
          使用ctrl+x ctrl+a 或者 ctrl+x A 關閉tui
          使用ctrl+x o來切換active的窗口
          set environment varname [=value] 設置環境變量。如:set env USER=user
          部分引用自:http://laokaddk.blog.51cto.com/368606/945057 以及http://blog.csdn.net/kuike/article/details/2065999
          打印符號所處的源代碼位置:
          info line <function_name>
          python (lambda s: [print(i.symtab,":",i.line) for i in gdb.lookup_static_symbols(s)])("one")
          python (lambda s: print(s.symtab,":",s.line))(gdb.lookup_symbol("<variable_name>")[0])
          ============================================================================================
          如果有部分swap內存被使用了,而這個時候主存還有地方,可以把swap里的內容挪動到主存里,方法是:
          sudo swapoff -a && sudo swapon -a

           

          =============================================================================================

          在本機假設一個最簡單的http server的方法是:python -m SimpleHTTPServer &  #會偵聽本機的8000端口,服務目錄就是當前目錄
          用netstat查看tcp協議監聽的端口:netstat -nlpt
          用netstat查看udp協議監聽的端口:netstat -nlpu
          當然也可以用netstat -nlptu一并查看tcp和udp協議監聽的端口

          用netstat查看tcp的連接:netstat -anpt
          用netstat查看udp的連接:netstat -anpu
          當然也可以用netstat -anptu一并查看tcp和udp協議的連接

          探測一臺remote機器是否打開了某個端口,一般我們用telnet ip port,但這種方法不成功的時候并不能肯定這個端口就一定是closed,而且對于udp協議的端口,該方法也不奏效,正確的方法是:
          nc -z ip port && echo tcp port open || (nc -z ip port && echo udp port open || echo no tcp/udp port open)
          或許一些機器上沒有安裝nc,可以試試看是否安裝了netcat,這兩個工具是一樣的。
          再簡要說說netcat這個工具,這個工具很有用,從名字上就看得出來它的用途,我們知道cat是針對文件進行bytes流的in/out,而netcat是針對網絡端口進行bytes流的in/out。
          比如
          1。netcat -l -p 13001 > t3.3 &   #listening 0.0.0.0:13001,把收到的內容重定向到t3.3文件中,或許該命令需要修改為netcat -l 127.0.0.1 13001 > t3.3 &
          2。echo "hello world" | netcat 127.0.0.1 13001  #向127.0.0.1:13001端口灌入一定的bytes
          3。cat t3.3  #t3.3中的內容就是hello world
          網絡上有一篇介紹基于udp的ssh tunnel的文章,就是用到了netcat這個工具:http://zarb.org/~gc/html/udp-in-ssh-tunneling.html

          可以通過tcpdump來查看一個端口上收發的所有包:
          tcpdump -vv -n -i lo 'tcp port 10000'

          ===================================================================

          vi小技巧:

          先按q再按:,則會出現歷史命令

          使用sudo權限保存w !sudo tee %

          在命令模式下,Ctrl+w,然后再按q即可退出,ZZ也可以退出

          Ctrl+o是退回到上次編輯的位置

          Ctrl+g可以顯示當前編輯的文件名以及編輯的行數和列數

          %是匹配括號

          在~/.vimrc中輸入以下兩行可以實現再次打開文件時光標位置被保存:

          " 打開文件時,按照 viminfo 保存的上次關閉時的光標位置重新設置光標
          au BufReadPost * if line("'\"") > 0|if line("'\"") <= line("$")|exe("norm '\"")|else|exe "norm $"|endif|endif

          命令行Readline的快捷鍵:

          Ctrl+a/e:跳到行首/尾;Ctrl+u/k:刪除前/后面的內容;Ctrl+h/d:刪除前/后一個字符;Ctrl+b/f:移動前/后一個字符;Ctrl+p/n:查看前/后一條命令;Ctrl+Esc+r:恢復該行最初始的狀態;Ctrl+r/s:向前/后根據搜索詞在歷史命令中進行搜索(其實還有 Ctrl+s 是正向增量查找的,但是由于這個快捷鍵被終端預設成鎖屏幕了,沒有效果。不過可以使用命令 stty -ixon -ixoff來解除綁定,恢復可以用stty ixon ixoff<其此處的設置對應了Ctrl+s/q這組命令,即鎖定/解鎖屏幕,尤其用在屏幕上出現飛速的碼流的時候有效果>);Alt+b/f:向前/后移動一個單詞;Alt+Backspace/d:向前/后刪除一個單詞;要想了解更多這方面的快捷鍵可以使用bind -P

          syndaemon -d -i 4可以使得:當你輸入文字時,觸摸板失效4秒

          showkey -a可以顯示鍵盤上任意一個鍵的ascii碼值,Ctrl+v加Ctrl+<key>能顯示該鍵的鍵盤碼

          grep的-I選項(大寫的i)可以讓它不搜索binary文件,而-a選項是搜索所有文件,binary文件也會當成文本文件去搜索,此外還可以配合--exclude/include=GLOB來排除文件或者搜索特定文件,--exclude-dir=DIR可以排除一個或多個文件夾,-o選項只搜索出匹配的部分,比如你要在~目錄下搜索隱藏文件中的配置文件中的一些信息,可以這樣: grep <searchword> -RI --include=.*  --exclude-dir=.ies4linux .

          在所有命令中查找匹配的命令: ls ${PATH//:/\ /} | grep <searchword>

          有關對readline的控制,強烈推薦下面這兩篇文章:

          http://blog.chinaunix.net/u1/43271/showart_340284.html

          http://hi.baidu.com/riant/blog/item/aacf7cd9d0f91fe939012f88.html

          這里我對bind命令作一下說明,舉個例子好了,設定Ctrl+t是正向搜索歷史命令(相對于Ctrl+r反向搜索):如果臨時使用,那么bind '"\C-t": forward-search-history'即可;如果長久保存,那么首先在~/.bashrc中設定export INPUTRC=/etc/inputrc,然后編輯/etc/inputrc,增加一行:"\C-t": forward-search-history即可。我還在/etc/inputrc中設定了"C-xf": dump-functions和"C-xv": dump-variables以及"C-xm": dump-macros三行,分別用于打印出所有可以設置的函數、變量、以及宏。注意:每次你修改完/etc/inputrc文件后,需要Ctrl-x然后Ctrl-r才能使修改發揮作用。

          在X的終端里,Ctrl+Shift+up/down可以實現屏幕的上下滾動,一行一行的滾動;shift+pageup/pagedown實現一屏一屏的滾動

          ls的小技巧:

          alias ls='ls --color=tty'
          alias ll='ls -l --color=tty'
          alias l.='ls -a -d .* --color=tty'
          alias lD='ls -a -d --color=tty .*/; ls -d */ --color=tty'
          alias la='ls -A'

          strace -p <PID>可以看到該進程執行的系統調用,其實該命令會把一個進程先attach然后分析,最后再釋放。

          還是bind的使用,我們可以配置ctrl+m來選擇一個目錄下的文件,這個特性對于那些文件名字特別難輸入的文件或目錄特別有幫助,你可以設想一下當在字符終端上沒有鼠標,且沒安裝中文輸入法時,你想打開一個含有中文文件名的文件是多么困難,但是有了這個特性,你就可以自由選擇了。實施方法如下:

          編輯/etc/inputrc,找到類似這行的(沒有就添加):
          代碼:
          $if mode=emacs
          "\C-o": menu-complete

          或者在命令行直接使用bind '"\C-o":menu-complete'也可以。

          ================================

          mv foo.{jpeg,jpg}#這個命令將把foo.jpeg改名為foo.jpg。
          !! 是整條命令和所有參數
          !* 將代替上一個命令的所有參數
          !$ 上一條命令的最后一個參數
          !:3  上一條命令的第3個參數 

          ===========================================

          vi學習
          :r !command: 將命令command的輸出結果放到當前行
          :e filename: 打開文件filename進行編輯(會關閉當前文檔重新打開新文檔,可以使用Ctrl+O/I來切換)
          :n1,n2 d: 將 n1行到n2行之間的內容刪除
          :r filename: 將文件中的內容全部插入到當前位置

          Ctrl+a: 如果當前光標下的字符串中,從當前位置起能在后續連續的字符串中找到數字,那么按一次Ctrl+a就會使得該數字加1,比如abc23, 那么就會使得23變為24
          s: 刪除當前字符,并切換到插入模式,可以允許你輸入文本
          H: 光標移至屏幕頂行
          M: 光標移至屏幕中間行
          L: 光標移至屏幕最后行
          nz: 將第n行滾至屏幕頂部,不指定n時將當前行滾至屏幕頂部,注意需要回車一下才生效。

          vi +n filename: 打開文件,并將光標置于第n行首
          ?pattern: 從光標開始處向文件首搜索pattern

          w或W : 光標右移一個字至字首
          b或B : 光標左移一個字至字首
          dw: 刪除右邊的一個字
          db: 刪除左邊的一個字

          browse vs/split: 用瀏覽窗口輔助你打開文件
          Ctrl+w,w  用于窗口間切換, 用Ctrl+w,Ctrl+w也可以, 這里主要考慮到了按鍵方便
          Ctrl+w,o  只保留當前窗口, 關閉其他窗口
          Ctrl+w,=  平均分配各個窗口
          Ctrl+w,數字<  在垂直切分窗口時,縮小當前窗口尺寸
          Ctrl+w,數字>  在垂直切分窗口時,放大當前窗口尺寸
          Ctrl+w,數字-  在水平切分窗口時,縮小當前窗口尺寸
          Ctrl+w,數字+  在水平切分窗口時,放大當前窗口尺寸
          Ctrl+w,c  關閉當前窗口
          Ctrl+w,s  將當前窗口橫著切割出另一個窗口, Ctrl+w,n也可以
          Ctrl+w,v  將當前窗口豎著切割出另一個窗口
          :split 文件名  用于在當前窗口中橫著切割出一個新的窗口, 并且將文件打開
          :vs 文件名  用于在當前窗口中豎著切割出一個新的窗口, 并且將文件打開

          mark標記: 新建一個標記用m, 后面可接數字或字母,  小寫字母僅能用于本文件中根據標記定位光標位置, 大寫字母可以實現文件之間的切換, 例如ma,m3,mA; 定位一個標記用單引號, 例如'a,'3,'A. 這里再舉個應用mark的例子, 在命令行模式下:'a,'b d用于刪除從'a到'b之間所有的行. 查看所有的mark的命令是:marks

          vi的寄存器: 用雙引號來建立, vim常用的寄存器有:
          ""     無名寄存器,包含最近刪除或抽出的文本
          "%     當前文件名
          "#     輪換文件名
          "*     剪貼板內容 (X11中表示 鼠標選擇的區域)
          "+     剪貼板內容
          "/     最近的搜索模式
          ":     最近的命令行
          ".     最近插入的文本
          "_     黑洞
          更為詳細的內容請參見http://blog.chinaunix.net/u/553/showart_361240.html和http://blog.chinaunix.net/u/9465/showart_448822.html
          調用寄存器時, 在普通模式可以用雙引號來調用, 如"a, 在插入模式下可以用Ctrl+r,a來調用寄存器a;對于用大寫字母表示的寄存器比如A, 代表向寄存器a中追加內容; 查看所有寄存器的內容用:reg
          "+y用于把vi中選中的部分復制到系統剪貼板上; "+yy用于把當前行復制到系統剪貼板上;"+p用于把系統剪貼板上的東西復制到當前位置

          查看所有對文件的改動用:changes

          vi使用ctags和taglist:
          在工程的頂層目錄下ctags -R
          vi –t main//可以打開所有定義了main函數的cpp文件
          :ts//會列出所有定義了main函數的位置, 你可以通過鍵入數字來選擇
          :tp//會在選擇下一個出現了main函數的cpp文件來顯示
          :tn//會在選擇上一個出現了main函數的cpp文件來顯示
          說明: 上面的ts,tp,tn都是針對vi -t main這個應用來談的, 其實它們也可以脫離這種場景去使用, 總之它們就是構建在ctags之上的, 用于搜索所有源文件中定義的變量或函數名之類的東西.

          WEB相對于web來說是長單詞移動命令,即只認識空格和換行
          {/}到上/下一段落
          [[/]]到上/下一個代碼塊{...}的開始處
          [{/]}到當前代碼塊{...}的{/}
          (/)移動到句首/尾
          S在當前行的任何一個位置運行該命令,可以把當前行的內容清空,然后移動到行首進入插入模式等待你輸入字符, 該命令等同于cc命令
          3S把當前的三行內容清空,并移動到行首且進入插入模式等待輸入
          s清空當前字符,并進入插入模式等你輸入字符
          10s清空當前的10個字符,并進入插入模式等你輸入字符,實際上對s和S的比較標準的翻譯是s多字符替換單字符,S整行替換
          .可以重復執行上一次的改變, 所謂改變指的是插入(i)或者刪除(d)或者替換(r)或者改變(c)的一次原子操作, 也就是不能將先刪除(d)3個字符再插入(i)5個字符這件事作為一個整體來對待, 如果想把這種情況用一次原子操作來完成, 你可以用c命令, 該命令會先直接把你想要改變的那個3個字符刪掉再允許你輸入5個字符作為替換
          qa開始錄制宏,并報存在寄存器a中,再次輸入q即可停止錄制宏,錄制宏的時候要注意在使用hjkl這些移動光標的命令時確保應用宏的時候不會有什么偏差,建議最好使用命令能定位光標,比如fFtT這樣的一行內的查找命令,有一篇文章舉的例子非常好:http://autodev.net/autodev/discuz/viewthread.php?tid=33
          :ab可以list出目前所有已經有的縮寫
          :ab hl hello world!可以用hl這個縮寫來代替hello world!,當你在insert模式下輸入hl后,再鍵入空格或者換行時就會發生上述的替換
          :unab hl撤銷hl這個縮寫
          d3w將刪除光標后 3 個單詞
          d2j將刪除當前行和下兩行
          :%s/regexp/replacement/gc可以讓你在替換之前確認一下
          <</>>將當前行向左/右縮進一次,縮進一次的大小取決于tabstop被設定的大小
          Ctrl+d/t在插入模式下向左/右縮進當前行
          ^移動到當前行的第一個非空白字符
          -/+移動到上/下一行的第一個非空白字符
          ]p粘貼的時候會考慮到縮進

          下面這個映射能夠使得在可視模式下選擇的文本,當你按下'/'鍵時由擴展可視范圍改為搜索選擇的文本

          :vmap / y/<C-R>"<CR>

          下面的鍵映射能夠使得在insert mode下移動光標:

          " 在插入模式下,移動光標
          imap <C-h> <C-o>h
          imap <C-j> <C-o>j
          imap <C-k> <C-o>k
          " to the left character, this way can go to the behind of last character
          imap <C-l> <ESC>la
          " to the begin of line
          imap <C-a> <ESC>0i
          " to the end of line
          imap <C-u> <ESC>A


          set list
          set listchars=tab:>-,trail:-
          highlight WhitespaceEOL ctermbg=magenta guibg=magenta
          match WhitespaceEOL /\s\+$\|\t/
          "highlight __SPACE ctermbg=yellow guibg=yellow
          "2match __SPACE / /

          ====================================
          ls -sSh
          ====================================
          發現驚天大秘密:呵呵,以前總覺得^A^B這些東西很奇怪,現在不覺得奇怪了,其實是有這樣一種邏輯在里面的:^A代表ascii碼為1的不可見字符,^B代表ascii碼為2的不可見字符,以此類推,因此我們最最熟悉的^M就代表ascii碼為13的字符了,也就是回車符號,而在linux的文本中都是使用換行符號作為行與行之間的分隔符的,因此^J就代表了換行符號,你可以用showkey -a來驗證我說的這些東西,但^這個符號要用ctrl鍵來代替,因此你要輸入ctrl+m才能看到效果。

          =============================
          top使用:
          f/o:選擇其他列;F/O:選擇要按之排序的列;R:反向排序;c:顯示完整的命令
          行;u:指定顯示某個用戶相關的信息;1:數字1顯示分開顯示多核 CPU;k:殺死
          某個PID;s:設置刷新的時間間隔;A:分四屏從不同角度顯示;G:從四種可供選
          擇的顯示組合中選定一種特定的顯示組合;B:加粗顯示 head里的數字信息;z:
          切換為紅黃顏色顯示;Z:選擇顏色顯示;</>:默認按照%CPU排序,選定的排序的
          列向左/右移動一列。
          ========================
          info的使用:
          b是到開頭,e是到結尾;到了某個結點回車是進入,u是返回上級;l(小寫的L)相當于后退;空格是向下翻頁,page up/down是向上/下翻頁;?是幫助;n和p分別是到下一個或上一個結點。
          ===========================
          screen使用:
          配置~/.screenrc為:

          altscreen on
          startup_message off
          defscrollback 100000
          #escape ^Xx
          backtick 1 0 0 sh -c 'echo $(ifconfig | grep Mask: | cut -d: -f2 | cut -d" " -f1 | grep -v 127.0.0.1; curl -s ifconfig.me)'
          backtick 2 60 60 sh -c 'uptime | sed -e "s/.*up *//" -e "s/,.*//"'
          #caption always "%{= wk} %{= KY} [%n]%t @ %H %{-} %= %{= KR} %l %{-} | %{= KG} %Y-%m-%d %{-} "
          ##hardstatus alwayslastline " %-Lw%{= Bw}%n%f %t%{-}%+Lw %=| %0c:%s "
          hardstatus alwayslastline "%{= KY} %-Lw%{= Bw}%n%f %t%{-}%+Lw %=@%H(%1`) %{=b KG}||%{-} %m/%d %0c %{=b KG}||%{-} up %2` %{=b KG}||%{-} %l"
          # mouse tracking allows to switch region focus by clicking, and you can't select texts by double-click texts if you open this flag
          # mousetrack on
          # get rid of silly xoff stuff
          bind s split
          # layouts
          layout autosave on
          # layout one region
          layout new one
          select 1
          # layout two region
          layout new two
          select 1
          split
          resize -v +8
          focus down
          select 4
          focus up
          # layout three region
          layout new three
          select 1
          split
          resize -v +7
          focus down
          select 3
          split -v
          resize -h +10
          focus right
          select 4
          focus up
          layout attach one
          layout select one
          # navigating regions with Ctrl-arrows
          bindkey "^[[1;5D" focus left
          bindkey "^[[1;5C" focus right
          bindkey "^[[1;5A" focus up
          bindkey "^[[1;5B" focus down
          # switch windows with F3 (prev) and F4 (next)
          bindkey "^[OR" prev
          bindkey "^[OS" next
          # switch layouts with Ctrl+F3 (prev layout) and Ctrl+F4 (next)
          bindkey "^[[1;5R" layout prev
          bindkey "^[[1;5S" layout next
          # F2 puts Screen into resize mode. Resize regions using hjkl keys.
          bindkey "^[OQ" eval "command -c rsz" # enter resize mode
          # use hjkl keys to resize regions
          bind -c rsz h eval "resize -h -5" "command -c rsz"
          bind -c rsz j eval "resize -v -5" "command -c rsz"
          bind -c rsz k eval "resize -v +5" "command -c rsz"
          bind -c rsz l eval "resize -h +5" "command -c rsz"
          # quickly switch between regions using tab and arrows
          bind -c rsz \t    eval "focus"       "command -c rsz" # Tab
          bind -c rsz -k kl eval "focus left"  "command -c rsz" # Left
          bind -c rsz -k kr eval "focus right" "command -c rsz" # Right
          bind -c rsz -k ku eval "focus up"    "command -c rsz" # Up
          bind -c rsz -k kd eval "focus down"  "command -c rsz" # Down

          使用時,新建一個tab是ctrl+a,c;退出一個tab是ctrl+d(其實就是正常退出即可,當然你也可以使用screen為你提供的ctrl+a,k來實現);退出所有的tab是ctrl+a,:quit或者是ctrl+a,ctrl+\也可以; 想退出screen干點別的事,但是卻不終止screen里面的進程,這叫detach,用ctrl+a,d可以實現,下次再想進入那個screen的時候,需要screen -ls一下看看當前都有那些screen, 然后screen -r <名字>來進入你想進入的screen, 當然你也可以在啟動screen的時候這么干: screen -S hello,當你detach screen之后想再次進入,那就screen -r hello即可.
          ctrl+a,': select a tab;
          ctrl+a,": open window manager to select a tab;

          Ctrl+a S split terminal horizontally into regions Ctrl+a c to create new window there
          Ctrl+a | split terminal vertically into regions Requires debian/ubuntu patched screen 4.0
          Ctrl+a :resize resize region  
          Ctrl+a :fit fit screen size to new terminal size Ctrl+a F is the same. Do after resizing xterm
          Ctrl+a :remove remove region Ctrl+a X is the same
          Ctrl+a tab Move to next region

          admin login
          screen -S class1
          Ctrl-a :multiuser on
          Ctrl-a :acladd lili

          lili login
          screen -x admin/session
          Ctrl-a :aclchg lili -w "#"

          Ctrl-a :wall message

          For detail info, plz refer to: http://www.linux.com/archive/feed/56443
          如果screen的sock文件被刪了(默認是在/tmp/下),導致無法attach,可以重建sock文件,方法是kill -CHLD 30860 #30860為screen進程的pid
          ===============================
          對于sudo這個命令,修改配置文件/etc/sudoers時直接用visudo就可以了,連文件名都省略了,而且還可以幫助你檢查格式,關于怎么寫配置文件的內容,請使用man sudoers,在幫助的最后部分給出了大量的實例,足夠你使用了,如果覺得看英文不爽,網上有很多這份man sudoers的中文版,比如http://www.fengnet.com/showart.asp?art_id=587&cat_id=10 我來總結一下,其實定義的格式就是who hosts = (可以偽裝成的用戶) [NOPASSWD:] commands
          ==============================
          對于sort命令, 最復雜的莫過于對POS1和POS2的設定了, 先給出結構:
          -k POS1,POS2 -k POS3,POS4, 例如sort -t : -n -k 5b,5b -k 3,3 /etc/passwd
          多個-k可以指定多個排序的鍵, 通常我們很少使得排序的鍵是跨越field的, 因此通常你會看到像上面那個例子里描述的那樣, 兩個5, 兩個3
          下面就來說一下POS的規則, 分為新標準和舊標準, 新標準:F[.C][Mbdfinr], 詳細說明如下:
          F是數字,代表第幾個Field;
          C是數字,代表Field內部的第幾個字符;
          Mbdfinr代表選項, 與sort -[Mbdfinr]一樣, 只不過前者只對當前POS有效, 后者對所有有效, 不過前者的優先級高于后者, 此處還有一點要說明: 因為一個-k會指定兩個POS,只要有一個POS中指定了Mbdfinr即可, 兩個都指定同一個也行
          再說說舊標準: +POS1 -POS2
          POS的規則和前面一樣, 但舊標準就只能指定一個key了, 不能像-k那樣可以搞出多個來; 而且在舊標準中的Field采用的是間隔的方式, 如果你期望按照第一個key來排序,那么就得使用+0 -1來實現, 而在新標準中是采用 -k 1,1
          ==================================
          簡要說說lsof最常用的幾種方法:
          lsof 文件 ==>查看文件被那些進程占用
          lsof -c bash ==>查看被進程名以bash開頭的進程占用的文件
          lsof -u root ==>查看root用戶使用到的文件
          lsof -p 2343 ==>查看被進程2343打開的文件
          lsof 目錄名 ==>查看目錄下打開的文件, 不遞歸, 深度為1
          lsof +D 目錄名 ==>查看目錄下打開的文件, 遞歸
          lsof -i ==>顯示所有端口建立的連接
          lsof -i :80 ==>顯示所有打開80端口的連接
          lsof -d 4==> 顯示fd為4的進程
          lsof -a -d4 -p $$ ==>這里的選項a表示將對d選項和p選項的結果的AND操作
          ========================
          關閉筆記本的屏幕的方法: xset dpms force off
          ================================
          vim 提供 6中折疊方式
                    manual           手工定義折疊(默認,常用)
                    indent             更多的縮進表示更高級別的折疊(常用)
                    expr                用表達式來定義折疊
                    syntax             用語法高亮來定義折疊(常用)
                    diff                  對沒有更改的文本進行折疊
                    marker            對文中的標志折疊

          set fdm=indent
          如果使用了indent方式,vim會自動的對大括號的中間部分進行折疊,我們可以直接使用這些現成的折疊成果。
          indent 對應的折疊代碼有:
          zc      折疊
          zC     對所在范圍內所有嵌套的折疊點進行折疊
          zo      展開折疊
          zO     對所在范圍內所有嵌套的折疊點展開
          [z       到當前打開的折疊的開始處。
          ]z       到當前打開的折疊的末尾處。
          zj       向下移動。到達下一個折疊的開始處。關閉的折疊也被計入。
          zk      向上移動到前一折疊的結束處。關閉的折疊也被計入。

          set fdm=manual
          可以使用下面的命令來創建和刪除折疊:
          zf      創建折疊,比如在marker方式下:
                             zf56G,創建從當前行起到56行的代碼折疊;
                             10zf或10zf+或zf10↓,創建從當前行起到后10行的代碼折疊。
                             10zf-或zf10↑,創建從當前行起到之前10行的代碼折疊。
                             在括號處zf%,創建從當前行起到對應的匹配的括號上去((),{},[],<>等)。
          zd      刪除 (delete) 在光標下的折疊。僅當 'foldmethod' 設為 "manual" 或 "marker" 時有效。
          zD     循環刪除 (Delete) 光標下的折疊,即嵌套刪除折疊。
                    僅當 'foldmethod' 設為 "manual" 或 "marker" 時有效。
          zE     除去 (Eliminate) 窗口里“所有”的折疊。
                    僅當 'foldmethod' 設為 "manual" 或 "marker" 時有效。
                 因此,對于fdm=indent之后,如果想消除通篇的折疊,簡單方法就是set fdm=manual,然后zE
          可以通過下面兩個來控制通篇折疊的啟停:
          :set nofoldenable
          :set foldenable

          ===============================================================
          vim的幫助很詳細,但若不了解有時的確不知道應該如何輸入關鍵詞,所以總結一下:
          -----------------------------------------------------------------------------
          條目                                      前綴                       例子
          -----------------------------------------------------------------------------
          Normal模式命令                    無                          :h k
          CTRL控制字符                       CTRL-                     :h CTRL-r
          Visual視圖模式                      v                            :h v_u
          Insert插入模式命令                i                             :h i_CTRL-o
          ex-模式命令                           :                            :h :set                                                                                         
          Command-line命令行編輯     c                            :h c_<BS>
          命令參數                                -                            :h -m
          選項                                      '                             :h 'winminwidth'
          ------------------------------------------------------------------------------
          哦,還有一些關鍵詞是用尖括號<>括起來的,如
          :h <Left>
          :h <CR>
          :h <Up>
          :helpg[rep] {pattern}  搜索所有的幫助文本并給出一個匹配 {pattern} 行的列表, 用:cw打開quickfix窗口看到所有的匹配位置, :cn/p用于向后/前翻看

          另外,在輸入關鍵詞的時候,可以按Tab鍵補全,ctrl-d列出與光標前面的關鍵詞所匹配的名字,ctrl-a列出全部模式
          =======================================
          在安裝了vim的插件之后,雖然幫助文檔已經放到doc目錄下了,但是還是需要調用vim的一個命令才能讓help找到,該命令是::helptags ~/.vim/doc
          =======================================
           vim里面的tab:
          vim *.cpp -p //用多個tab打開多個文件
          在normal模式下:
            gt //切換到下一個tab
            gT //切換到上一個tab
            Ctrl-w T //把當前的window放到一個新的tab中打開
          在command模式下:
            :tabnew [filename] //打開一個新的tab
            :tabn //切換到下一個tab
            :tabp //切換到上一個tab
            :tabs //list出當前所有的tab

          vim里面的gf:
          在noraml模式下:
            gf //打開鼠標下的文件
            gF //打開鼠標下的文件,并且跳轉到指定的行(例如 t1.cpp 20)
            Ctrl+w f //水平切分出一個新的窗口,里面打開鼠標下的文件
            Ctrl+w F //水平切分出一個新的窗口,里面打開鼠標下的文件,并且跳轉到指定的行(例如 t1.cpp 20)
            Ctrl+w gf //打開一個新的tab,里面打開鼠標下的文件
            Ctrl+w gF //打開一個新的tab,里面打開鼠標下的文件,并且跳轉到指定的行(例如 t1.cpp 20)
          gf, gF, Ctrl+w gf, Ctrl+w gF均支持在visual模式下,只處理visual部分對應的文件
          ======================================================================
          gcc/g++步驟拆解:
          gcc -E hello.c -o hello.i//使用cpp命令
          gcc -S hello.i -o hello.s//使用cc1命令
          gcc -c hello.s -o hello.o//使用as命令
          gcc hello.o -o hello//使用ld命令
          注意事項:
          1. 這些步驟是對文件名的后綴有要求的,例如-E產生hello.E,然后在-S步驟是不行的;
          2. 用g++可以對cpp文件做同樣的步驟;
          gcc 參數:
          -S: 生成匯編文件
          -E: 輸出預編譯結果 或者 用cpp t.cpp也行; 基本上g++ -E就等于cpp
          -H: 編譯并打印出引用的頭文件
          -E -dD: 預編譯, 并且將用到的宏擴展都給列了出來
          -###: 打印出編譯gcc時用到的參數
          # 與宏有關的
          gcc -dM -E - <<< '' -o a.E #查看gcc builtin的宏
          gcc -dM -E a.cpp -o a.dM #查看所有相關的宏定義
          gcc -dD -E a.cpp -o a.dD #查看所有相關的宏定義,并且指明出處
          gcc -E a.cpp -o a.E #查看宏替換完成,預編譯后的結果
          # 與頭文件有關的
          gcc -H a.cpp -o a.H #查看所有依賴的頭文件,而且引用關系通過行前綴.的多少能夠體現出來
          gcc -M a.cpp -o a.M #查看所有依賴的文件
          gcc -MM a.cpp -o a.MM #查看所有依賴的文件,但不包括系統頭文件
          gcc -MM -MP -MD -MF a.dep a.cpp -c -o a.o #正常編譯,但同時產出一個附屬品a.dep用于描述編譯a.cpp所有依賴的東西,a.dep可用于Makefile檢測a.cpp依賴是否有變化,這會比我們通常寫的a.o: a.cpp這種要強大的多;-MD是為了讓編譯繼續(-E會導致停在預編譯階段,-M/-MM/-MP等都會暗含-E參數,加上-MD則會又把-E給省略掉);-MP是為了讓a.dep里除了a.cpp的所有依賴之外,還能有每一個依賴的phony target;-MF是用于指定附屬品的文件名,如果沒有這個參數,默認會使用a.d(a.d的由來是根據-o a.o得來的,如果是-o XXX.o,那么就是XXX.d)
          生成靜態庫用ar crs libtest.a *.o;還可以生成thin archive,用ar crsT libtest.a *.o. thin archive只是存了真正的.o的位置,因此體積很小,而且ar crsT libtest.a libanother.a會把libanother.a中的.o的位置提取出來放到libtest.a中,對于local build,thin archive非常棒。
          對于從靜態庫生成動態庫,標準的方法是ar x libtest.a(注意thin archive是不能ar x的,這里的libtest.a是普通的archive),然后再g++ -shared -o libtest.so *.o,但也可以直接用.a來生成.so,如果是普通archive,需要用-Wl,--whole-archive libtest.a -Wl,--no-whole-archive -lpthread -ld(這種方法,當多個.a中含有相同符號時,會出現沖突,因為該方式會把.a中的所有符號都鏈接進來);除了可以用--whole-archive方法,還可以用-Wl,--start-group *.a -Wl,--end-group,這種方法會解決repeated查找中間那些.a文件中的符號,可以解決交叉依賴的問題,但要注意的是位于--start-group和--end-group之間的那些.a,它們只是被用于從中抽取必須的symbol,至于哪些symbol需要被用到,這個是由為生成.so所顯示指定的.o來決定的,如果不指定任何.o,僅僅用一大堆.a,那么生成的.so中不會有任何有用的symbol,例如g++ -shared -o libt28.so -Wl,--start-group libt28_1.a libt28_2.a libdict.a -Wl,--end-group產生的libt28.so中就不會含有libt28_1.a libt28_2.a libdict.a中的任何symbol;但如果是g++ -shared -o libt28.so -Wl,--start-group libt28_1.a libt28_2.a libdict.a test.o -Wl,--end-group,那么會根據test.o中哪些symbol需要從libt28_1.a libt28_2.a libdict.a中得到來決定哪些symbol進入最終的libt28.so。雖然.a的本質就是.o的集合,但ld對待.a和.o是很不一樣的。ld還有一個鏈接選項是-u,可以顯示讓某個symbol變為undified。
          ==========================================
          清除log中的顏色控制字符:sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
          ================================
          more或less里面,默認搜索的時候是大小寫*不敏感*的, 要想改為*敏感*的, 直接在正常狀態下鍵入-i即可, 再次鍵入-i即可切換到*不敏感*; 在vi里面默認搜索是大小寫*敏感*的, 可以在搜索的時候通過添加\c的suffix改為*不敏感*, 例如輸入/abc\c
          =========================================
          svn merge -r 854:853 test.cpp
          svn diff --summarize -r 853:854
          svn pg svn:externals .
          svn ps svn:externals 'seg_tc https://bj-scm.tencent.com/search/search_discuz_rep/discuz_code_proj/trunk/rela_content/encode3.0/seg_tc' .
          svn ps svn:externals -F svn.externals .
          =========================================
          awk中的map真的很好使,此前沒用到這個東西,以后要多加利用了,哈哈。
          netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
          =========================================
          ps -eo pid,ppid,lstart,etime,cmd  | grep XXX #lstart代表進程開始執行的時間,etime是進程運行到現在歷時多久
          ps -ef 可以看到ppid
          =========================================
          grep -P 'a\tb'
          grep "a"$'\t'"b"
          grep 'a    b' #tab鍵的輸入方法是Ctrl+v,然后按tab鍵
          =============================================
          find -size +1000c -size -2000c #查找文件大小在(1000,2000)之間的文件
          find -size 1000c #查找文件大小正好等于1000的文件
          find -mmin -1 #查找近1分鐘之內修改過的文件
          find -amin -1 #查找近1分鐘之內訪問過的文件
          find -empty #查找空文件或空目錄

          ==============================================

          cat input_file | python -c "import zlib,sys;print zlib.compress(sys.stdin.read())" #用于壓縮,當然改為uncompress就可用于解壓縮

          ==================================================

          1. 查看內核版本命令:
          cat /proc/version
          uname -a
          2. 查看Linux版本:
          lsb_release -a
          cat /etc/issue
          cat /etc/*release*
          =====================================================
          vim下的cursorline和cursorcolumn
          set   cursorline
          highlight CursorLine ctermbg=lightmagenta term=bold cterm=bold
          "set   cursorcolumn                                                                                                                                                                                                                            
          "set   startofline! "當cursorcolumn激活時,當ctrl+f/b翻頁時,光標會跑,取消了這個選項后,光標就不跑了
          highlight CursorColumn ctermbg=lightmagenta term=bold cterm=bold

          ==================================================================
          在vi中執行命令處理當前文檔的內容

          :! ls #執行一下ls命令
          :.! for i in {1..100}; do echo $i; done #.代表當前行,即把當前行的內容輸入給!后面的命令,!后面的命令用處理后的結果替換當前行
          :%!sort | uniq -c #%代表所有行,即把所有行的內容作為input給sort | uniq -c,輸出的結果再替換原有的所有行的內容
          :23,28!grep ok #把23行到28行之間的內容輸入給grep ok命令,用處理后的結果替換23行到28行之間的內容
          :%! sudo tee % #第一個%代表該文檔的所有行,第2個%代表當前的文件名,這個命令相當于cat current_file | sudo tee current_file,其實就是相當于用sudo權限重新把當前內容寫到文檔里,這對于我們忘記了用sudo vi current_file的人來說是多么美妙的一件事情啊

           ==============================================

          nm -C //demangle symbol
          nm -D -C //just dynamic symbol, 該選項用于查看so文件中的可以導出的符號,即便so被strip也沒問題
          nm -l -C //print line number

          ==========================================

          編譯時,第一步一般都是./configure
          這個shell腳本里面是通過pkg-config工具來辨認依賴的包是否已經安裝,configure過程的日志記錄在config.log文件中,如果configure失敗,可以查看該文件來進行診斷
          ./configure --help | grep '\(dis\|en\)able' #查看可以配置的features
          pkg-config工具會讀取/usr/share/pkgconfig/目錄下的*.pc文件,*.pc文件中記錄了編譯包時的CFlags以及這個包在當前機器里的includedir和libdir等信息。有時候通過dpkg -l會發現包已經安裝,但卻沒有包對應的pc文件,這個時候需要安裝該包的dev版。
          可以通過apt-file search XXX.pc來找到包含該文件的安裝包。
          如果某些時候無法通過apt-get install來安裝dev版的包,可以下載一個源碼包,然后./configure && make, make -n install可以查看都哪些文件要install,確認之后make install,默認是安裝到/usr/local/XXX/下面,這時可以cp /usr/local/XXX/lib/pkgconfig/XXX.pc /usr/share/pkgconfig/下,然后安裝;更好的方法是mkdir here_installation; ./configure --prefix=$PWD/here_installation; make; make install;然后export PKG_CONFIG_PATH=/home/admin/zbar-0.10+doc/ImageMagick-6.8.6-8/here_installation/lib/pkgconfig/,然后再編譯zbar-0.10+doc即可找到需要的pc文件了。
          cmake也是通過pkg-config來檢測包的安裝情況的,它的配置文件是CMakeLists.txt。
          下面這種編譯方式可以編譯出來debug版本的,而且只有靜態庫:
          ./configure --prefix=$PWD/here_installation --disable-shared CFLAGS="-g -O0" CPPFLAGS="-g -O0" CXXFLAGS="-g -O0"
          ======================================================
          如果ssh連接很慢,可以用ssh -v來看一下debug信息,試試配置一下/etc/ssh/ssh_config文件里的GSSAPIAuthentication no選項。
          ======================================================
          sort -R file 或者shuf file可以random打亂文件順序,可以設置一個random的seed通過--random-source=FILE
          ======================================================
          通過gzip壓縮得到的*.gz文件和通過zlib庫壓縮出來的東西不一樣,前者通過zcat或者gunzip可以解壓縮,后者必須通過zlib庫來解壓縮,沒有現成的工具,不過可以使用cat XXX | python -c "import zlib,sys;print repr(zlib.decompress(sys.stdin.read()))"
          =======================================================

           

          wget -e http-proxy=proxy.satwe.com:8080 --proxy=on --proxy-user=hamo --proxy-passwd=8888 -c http://www.satwe.com
          =======================================================

           

          ssh-copy-id user@host

           

          man less | col -b > less.txt #這個命令可以讓你把man文件轉成純文本文件
          PAGER=cat man less > less.txt #這個命令可以讓你把man文件轉成純文本文件
          vim scp://username@host//path/to/somefile #vim一個遠程文件
          curl ifconfig.me #當你的機器在內網的時候,可以通過這個命令查看外網的IP
          wget --random-wait -r -p -e robots=off -U mozilla http://www.example.com #下載整個www.example.com網站
          screen -d -m -S some_name ping my_router #后臺運行一段不終止的程序,并可以隨時查看它的狀態。-d -m參數啟動“分離”模式,-S指定了一個session的標識。可以通過-R命令來重新“掛載”一個標識的session。更多細節請參考screen用法 man screen
          ssh user@host cat /path/to/remotefile | diff /path/to/localfile - #比較一個遠程文件和一個本地文件
          ssh user@server bash < /path/to/local/script.sh #在遠程機器上運行一段腳本。這條命令最大的好處就是不用把腳本拷到遠程機器上
          man ascii #顯示ascii碼表
          mtr coolshell.cn #mtr命令比traceroute要好
          echo "ls -l" | at midnight #在某個時間運行某個命令
          curl -u username -s "https://mail.google.com/mail/feed/atom" | perl -ne 'print "\t" if /<name>/; print "$2\n" if /<(title|name)>(.*)<\/\1>/;' #檢查你的gmail未讀郵件
          tr -c "[:digit:]" " " < /dev/urandom | dd cbs=$COLUMNS conv=unblock | GREP_COLOR="1;32" grep --color "[^ ]" #想看看Marix的屏幕效果嗎?
          echo 123456 | dd cbs=2 conv=unblock #把一行內的字符按照固定寬度切分為多行
          ls | xargs -P 5 -i echo "This is:{}" #并行度為5來執行命令

          ======================================================================

          搭建web-based ssh terminal
          參考:http://en.wikipedia.org/wiki/Web-based_SSH
          下載https://code.google.com/p/shellinabox/,運行:sudo ./shellinaboxd -t -b -q --css=shellinabox/white-on-black.css
          =======================================================================
          jar的使用:
          jar tvf XX.jar;
          jar xvf XX.jar;
          jar cvf XX.jar a.class;
          javac的使用:
          javac -classpath /home/admin/a/b.jar:a/b/c.jar a.java
          使用jode把*.class文件反編譯成*.java文件:
          下載地址:http://jode.sourceforge.net/download.php
          jar xvf jode-1.1.2-pre1.jar
          java jode.decompiler.Main a.jar
          java的使用:
          java -h
          Usage: java [-options] class [args...]
                     (to execute a class)
             or  java [-options] -jar jarfile [args...]
                     (to execute a jar file)
          java jode.decompiler.Main a.jar #如果jode-1.1.2-pre1.jar里的META-INF/MANIFEST.MF文件里是這么寫的Main-Class: jode.decompiler.Main,那么也可以用java -jar jode-1.1.2-pre1.jar a.jar
          java -jar a.jar arg1 arg2 arg3
          =========================================================
          如果聲音異常,重啟聲卡:
          sudo alsa force-reload
          ===========================================================
          sudo apt-add-repository ppa:werner-jaeger/ppa-werner-vpn
          sudo apt-get update
          sudo apt-get install l2tp-ipsec-vpn

           

          ===========================================================
          man -l XXX.1 可以對指定文件用man
          ===========================================================
          今天觸發了一個bug,當只有.a文件時,下面兩種編譯是不一樣的:
          g++ -o WpuServer -Ithrift-0.9.0/here_installation/include/ -Iboost_1_53_0  -I../gen-cpp -Lthrift-0.9.0/here_installation/lib/ -pthread -lrt WpuServer.cpp ../gen-cpp/WorkitemProcessUnit.cpp ../gen-cpp/wpu_types.cpp ../gen-cpp/wpu_constants.cpp -lthrift #ld ok
          g++ -o WpuServer -Ithrift-0.9.0/here_installation/include/ -Iboost_1_53_0  -I../gen-cpp -Lthrift-0.9.0/here_installation/lib/ -pthread -lrt -lthrift WpuServer.cpp ../gen-cpp/WorkitemProcessUnit.cpp ../gen-cpp/wpu_types.cpp ../gen-cpp/wpu_constants.cpp #ld error
          ===========================================================
          hadoop fs -cat /home/mr/hadoop/tmp/mapred/system/job_201306051048_50459/job.jar | jar x #用于拿到任務相關的所有信息,包括map/reduce相關的程序和配置以及數據文件
          ===========================================================
          perl -e "alarm 2; exec @ARGV" "sleep 3; echo 35" #設置超時來運行命令
          ===========================================================
          cat myfile | perl -MList::Util=shuffle -e 'print shuffle(<STDIN>);' #替代shuf命令
          ===========================================================
          tac #按照行reverse
          rev #行內按照字符reverse
          diff #按照行進行diff
          cmp #按照字符進行diff
          > test.txt echo "hello world!" #輸出到test.txt文件中
          < test.txt cat #從text.txt文件中讀取內容
          cat <(echo "abcd") #cat讀的是一個文件
          cat < <(echo "abcd") #cat讀的是stdin
          cat <<<"abcd" #cat讀的是stdin
          cat <<{{
          abcd
          {{ #cat讀的是stdin
          cat <<{{ test.txt
          abcd
          {{ #cat讀的是stdin和test.txt文件
          cmp -bl <(echo "abcde") <(echo "abCdE") #比較兩個等長的字符串,并打印出不同的字符
          =============================================================
          echo a我bc' | grep -P "[\x20-\x7F]"
          grep -o -P '(?<=<text><!\[CDATA\[).*?(?=\]\]></text>)'
          regex有BRE(Basic Regular Expression),ERE(Extended Regular Expression),PCRE(Perl Compatible Regular Expression)三種,GNU的BRE和ERE是一樣的,PCRE支持正反向預查以及非貪婪模式,上面那個正則用于從xml中找出<text>...</text>之間的文字,注意.*?,這里的?是表示非貪婪匹配,即盡可能短的去匹配。

          ==============================================================

          $ printf "\xe6\x88\x91\xe4\xbb\xac\n" 
          我們
          $ printf "%'d\n" 23423423423
          23,423,423,423
          < t1.cpp tee >(column -t > t3.3) >(cat -n > t3.4) >/dev/null
          paste -d'@' t3.3 t3.4
          $ echo {1..8} | sed 's/ /\n/' | xargs -n 2
          1 2
          3 4
          5 6
          7 8
          $ echo {1..8} | sed 's/ /\n/g' | xargs -L 2
          1 2
          3 4
          5 6
          7 8
          =============================================================
          screen usage:
          {Ctrl+a x} lock screen
          {Ctrl+a "} select window from list
          {Ctrl+a X} remove one region that is generated by {Ctrl+a S} or {Ctrl+a |}
          {Ctrl+a [} or {Ctrl+a Esc} enter copy mode,
          After enter copy mode, how to mark characters and copy them:
          1. copy one line, Y;
          2. copy one word, W;
          3. copy a range from specific pos in one line: <space> firstly, move cursor, <space> secondly;
          4. copy multiple lines: y, move cursor, <space>;
          {Ctrl+a ]} or {Esc} exit copy mode
          {Ctrl+a >} write paste buffer to file(/tmp/screen-exchange)
          {Ctrl+a <} read from file(/tmp/screen-exchange) into paste buffer
          {Ctrl+a ]} paste buffer into current cmdline

          ================================================================

          如何更改一個已經運行的程序的輸入輸出
          gdb attach 1323
          (gdb) call creat("/tmp/myprog.stdout",0600)
          $1 = 7
          (gdb) call dup2(7,1)
          $2 = 1
          (gdb) call creat("/tmp/myprog.stderr",0600)
          $3 = 8
          (gdb) call dup2(8,2)
          $4 = 2 

           ================
          useradd或usermod添加當前用戶到某個group之后,通過id命令發現自身仍然不在那個group里,可以用如下命令:newgrp - new_group_name
          =============

          解決`locale -a`發現en_US.UTF-8缺失的問題:localedef -i en_US -f UTF-8 en_US.UTF-8
          =============

           

          所有man文件里搜索:
          man -wK FIFO
          man -wK --regex 'call.*main'

          posted on 2009-06-13 11:14 so true 閱讀(2098) 評論(0)  編輯  收藏 所屬分類: Linux

          主站蜘蛛池模板: 南昌市| 上饶市| 肥城市| 缙云县| 西和县| 竹北市| 周宁县| 潍坊市| 霞浦县| 门头沟区| 昂仁县| 濮阳县| 卢湾区| 久治县| 定安县| 新干县| 塘沽区| 莒南县| 离岛区| 红安县| 康乐县| 舒兰市| 文山县| 沁源县| 明光市| 宁城县| 山东| 昌乐县| 炎陵县| 革吉县| 武清区| 突泉县| 西丰县| 荃湾区| 长阳| 松桃| 吐鲁番市| 商南县| 定陶县| 福清市| 时尚|