so true

心怀未来,开创未来!
随笔 - 160, 文章 - 0, 评论 - 40, 引用 - 0
数据加载中……

Linux学习菁华

@import url(http://www.blogjava.net/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.blogjava.net/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,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 阅读(2031) 评论(0)  编辑  收藏 所属分类: Linux


只有注册用户登录后才能发表评论。


网站导航: