Linux學習菁華
1. 在Gdb中可以調用printf做格式化打印:
printf "%.2000s",s
2. Gdb可以將交互輸出到文件。需要調用如下兩個命令:
set logging onset logging file xxx.txt
以上兩個命令配合可以起到將長字符串打印到文件的作用。
但是如果字符串中有若干不可見字符,就不能使用這種方法了。這時候我們需要把數據 dump到文件中。命令如下:dump binary memory s.txt s s+1000
s是一個字符串指針,表示dump的起始位置,s+1000表示dump的末尾。S.txt表示結果
dump的文件名具體的參數意義可以看gdb的mannual
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)。
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里查看源代碼需要增加額外路徑:
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的內部了。
打印符號所處的源代碼位置:
如果有部分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為:
使用時,新建一個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
可以通過下面兩個來控制通篇折疊的啟停:
===============================================================
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 *.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部分對應的文件
-S: 生成匯編文件
-E: 輸出預編譯結果 或者 用cpp t.cpp也行; 基本上g++ -E就等于cpp
-H: 編譯并打印出引用的頭文件
-E -dD: 預編譯, 并且將用到的宏擴展都給列了出來
-###: 打印出編譯gcc時用到的參數
清除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 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 #查找空文件或空目錄
==============================================
==================================================
=====================================================
vim下的cursorline和cursorcolumn
highlight CursorColumn ctermbg=lightmagenta term=bold cterm=bold
==================================================================
在vi中執行命令處理當前文檔的內容
==============================================
==========================================
下面這種編譯方式可以編譯出來debug版本的,而且只有靜態庫:
如果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()))"
=======================================================
=======================================================
======================================================================
=======================================================================
=========================================================
===========================================================
man -l XXX.1 可以對指定文件用man
cat myfile | perl -MList::Util=shuffle -e 'print shuffle(<STDIN>);' #替代shuf命令
tac #按照行reverse
> test.txt echo "hello world!" #輸出到test.txt文件中
< test.txt cat #從text.txt文件中讀取內容
=============================================================
==============================================================
=============================================================
================================================================
================
useradd或usermod添加當前用戶到某個group之后,通過id命令發現自身仍然不在那個group里,可以用如下命令:newgrp - new_group_name
=============
=============
man -wK FIFO
posted on 2009-06-13 11:14 so true 閱讀(2098) 評論(0) 編輯 收藏 所屬分類: Linux