<commit_before>[TOC]
学习系统结构的最好方法是自己做一个linux系统，再也没有什么能比自己做一个linux系统更能学习系统结构的了。LFS (linux from strach)可以教你从源代码自己编译一个系统。通过自己编译一个系统，你就可以了结linux系统结构，知道哪些文件是干什么用的，以及他们如何协调 工作。
Linux内核设计与实现 Linux Kernel Development(Third Edition)-Robort Love

shortcuts:
^Z jobs fg(前台运行)， bg(后台运行)
vimtutor: vim interactive guide
Ctrl+h: show hidden files
nautilus: open your home folder
location: make a command can be call anywhere

# Common command
用m命令先标记这个位置，继续重复你的修改，稍后再返回到这个位置。重复修改一个单词。

` jump back to the exact position 
' jump back to the start of the line
'a 	jump to line of mark a (first non-blank character in line)

{	移到段落的开头
}	移到下一个段落的开头
%	匹配括号移动，包括 (, {, [.（陈皓注：你需要把光标先移到括号上） 跳转到与之匹配的括号处

:sh	暂时退出vi到系统下，结束时按Ctrl + d则回到vi
:r!command	将命令command的输出结果放到当前行【强大】

diw	删除当前光标所在的word(不包括空白字符)，意为Delete Inner Word 两个符号之间的单词
daw	删除当前光标所在的word(包括空白字符)，意为Delete A Word


kill -9 `ps -ef |grep GA | grep -v grep | awk '{print $2}'`

# Basic command
## VI
```
:set nu / :set nonu	(不)列出行号 (nu为行数)
:set ic / :set noic	vi在查找过程中(不)区分大小写 :set ignorecase/:set noignorecase
~	切换大小写
:sp	^Z jobs fg 
dt"  删除所有的内容，直到遇到"
改变与替换操作命令 
<r> 替换光标所在的字符 
<R> 替换字符序列 
<cw> 替换一个单词 
<ce> 同<cw> 
<cb> 替换光标所在的前一字符 
<c$> 替换自光标位置至行尾的所有字符 
<C> 同<c$> 
<cc> 替换当前行
read -p "Press enter to continue"
read -n 1 -p "Press any key to continue"
sleep 2; echo 'end sleep 2 sec

zoom in on your terminal with Ctrl+Shift++.
Zoom out with Ctrl+-

:x == :wq 当文件被修改时两个命令时相同的。但如果未被修改，使用 :x 不会更改文件的修改时间，而使用 :wq 会改变文件的修改时间
:w !sudo tee %  在VIM中保存一个当前用户无权限修改的文件
. 命令重复上次的修改。
:! command allows you to enter the name of a shell command
修改在这里就是插入、删除或者替换文本。能够重复是一个非常强大的机制。如果你基于它来安排你的编辑，许多修改将变得只是敲.键。留意其间的其他修改，因为它会替代你原来要重复的修改。相反，你可以用m命令先标记这个位置，继续重复你的修改，稍后再返回到这个位置。
重复修改一个单词。
如果是在整个文件中，你可以使用:s（substitute）命令。如果只是几个地方需要修改，一种快速的方法是使用 * 命令去找到下一个出现的单词，使用cw命令修改它。然后输入n去找到下一个单词，输入英文逗点 . 去重复cw命令。
删除多行
1. 如果要删除的段落的下一行是空行 一般用d} , 按两个键就可以了 多段的时候再按 .
2. 如果要删除的段落的下一行不是空行 则很容易找到该行的模式， 如该行存在function字串 一般 d/fu 也就搞定了

` jump back to the exact position 
' jump back to the start of the line
'. last edit line the start of the line
`. last edit line the exact position 
'' last location the start of the line
`` last location the exact position 
Use `` to jump back to the exact position you were in before you searched/jumped, or '' to jump back to the start of the line you were on before you searched/jumped.
You really should read :help jumplist it explains all of this very well.

'a 	jump to line of mark a (first non-blank character in line)
:marks 	list all the current marks
:marks aB 	list marks a, B

段落
{	移到段落的开头
}	移到下一个段落的开头
%	匹配括号移动，包括 (, {, [.（陈皓注：你需要把光标先移到括号上） 跳转到与之匹配的括号处
zf 	折叠（需加方向键）
zo	展开（空格也可以展开） 可以zf进行折叠, 用zo打开折叠,也可以方向键向右打开折叠,zc 关闭折叠(只要在被折叠的块中的任一个语句就行)
zz(or z.)	put the line under cusor in the middle of the screenv(z字取其象形意义模拟一张纸的折叠及变形位置重置)
zt	命令会把当前行置于屏幕顶端(top)
zb	命令会把当前行置于屏幕底端(bottom)

Add comments for multiple lines
	press Ctrl-V to enter visual block mode and press "down" until all the lines are marked. Then press I to insert at the beginning (of the block). The inserted characters will be inserted in each line at the left of the marked block.

yw 只有当当前光标处于单词的第一个字母时才是“复制整个单词”(包含末尾的空格)，而 yiw 不管当前光标处于单词的哪个字母，都是复制整个单词(不包括末尾的空格)
输入单词A的前几个字母，然后ctrl+N补全。<C-o><C-n> <C-o><C-p> 只是简单的上下文补全，还有<C-o><C-f> 用于对目录名进行补全
guw	光标下的单词变为小写
gUw	光标下的单词变为大写
ga	显示光标下的字符在当前使用的encoding下的内码

### 文件对比 合并 多窗口
diff -u
vimdiff  FILE_LEFT  FILE_RIGHT
:qa (quit all)同时退出两个文件
:wa (write all)
:wqa (write, then quit all)
:qa! (force to quit all)

Ctrl-w K(把当前窗口移到最上边)
Ctrl-w H(把当前窗口移到最左边)
Ctrl-w J(把当前窗口移到最下边)
Ctrl-w L(把当前窗口移到最右边)
ctrl-w,r 交换上/下、左/右两个分隔窗口的位置
其中2和4两个操作会把窗口改成垂直分割方式。
在两个文件之间来回跳转，可以用下列命令序列Ctrl-w, w
可以使用快捷键在各个差异点之间快速移动。跳转到下一个差异点：]c. 反向跳转是：[c
> -+ 调整窗口大小

dp (diff "put") 把一个差异点中当前文件的内容复制到另一个文件里
do (diff "get"，之所以不用dg，是因为dg已经被另一个命令占用了)把另一个文件的内容复制到当前行
:diffu[pdate] #更新diff 修改文件后，vimdiff会试图自动来重新比较文件，来实时反映比较结果。但是也会有处理失败的情况，这个时候需要手工来刷新比较结果：
zo (folding open，之所以用z这个字母，是因为它看上去比较像折叠着的纸) 展开被折叠的相同的文本行
zc (folding close)重新折叠
```

### Mutiple tab
:n next file :p previous file
:bn 和 :bp :n 使用这两个命令来切换下一个或上一个文件。（陈皓注：我喜欢使用:n到下一个文件）
Ctrl+o takes me to the previous tab location.
Ctrl+^ last tab

### Replace
:g/old			查找old，并打印出现它的每一行
:s/old/new		替换当前行第一个old
:s/old/new/gc	当前行old全替换并需要确认
:n,ms/old/new/g	n,m are the line numbers; n can be (.), which represent current line
:%s/old/new/gc	全文替换,也可用1,$表示从第一行到文本结束
:%s/^ *//gc		去掉所有的行首空格
/可以用#代替, 
:s：等同于 :s//~/，即会重复上一次替换
:& repeat last :s command
:g/^\s*$/d	delete the blank lines
:%s/\s\s/\t/gc	convert two space(\s\s) to tab(\t)
:%s/\s\+/,/g	use a substitution (:s///) over each line (%) to replace all (g) continuous whitespace (\s\+) with a comma (,).
pattern [^0-9]*,	matches string start with non-number until to (,)

### custom keyboard shortcut
inoremap jj <ESC>	# Remap Your ESCAPE Key in Vim
nnoremap j VipJ
:sh	暂时退出vi到系统下，结束时按Ctrl + d则回到vi
:r!command	将命令command的输出结果放到当前行【强大】
diw	删除当前光标所在的word(不包括空白字符)，意为Delete Inner Word 两个符号之间的单词
daw	删除当前光标所在的word(包括空白字符)，意为Delete A Word
:map	列出当前已定义的映射

### VI正则表达式
元字符 	说明
. 	匹配任意字符
[abc] 	匹配方括号中的任意一个字符，可用-表示字符范围。如[a-z0-9]匹配小写字母和数字
[^abc] 	匹配除方括号中字符之外的任意字符
\d 	匹配阿拉伯数字，等同于[0-9]
\D 	匹配阿拉伯数字之外的任意字符，等同于[^0-9]
\x 	匹配十六进制数字，等同于[0-9A-Fa-f]
\X 	匹配十六进制数字之外的任意字符，等同于[^0-9A-Fa-f]
\l 	匹配[a-z]
\L 	匹配[^a-z]
\u 	匹配[A-Z]
\U 	匹配[^A-Z]
\w 	匹配单词字母，等同于[0-9A-Za-z_]
\W 	匹配单词字母之外的任意字符，等同于[^0-9A-Za-z_]
\t 	匹配<TAB>字符
\s 	匹配空白字符，等同于[\t]
\S 	匹配非空白字符，等同于[^\t]

一些普通字符需转意
元字符 	说明
\* 	匹配* 字符
. 	匹配. 字符
\/ 	匹配 / 字符
\ 	匹配 \ 字符
\[ 	匹配 [ 字符
\] 	匹配 ] 字符

表示数量的元字符
元字符 	说明
* 	匹配0-任意个
\+ 	匹配1-任意个
\? 	匹配0-1个
\{n,m} 	匹配n-m个
\{n} 	匹配n个
\{n,} 	匹配n-任意个
\{,m} 	匹配0-m个

表示位置的元字符
元字符 	说明
$ 	匹配行尾
^ 	匹配行首
\< 	匹配单词词首
\> 	匹配单词词尾


## find grep
```
grep pattern files – 搜索 files 中匹配 pattern 的内容
grep -r pattern dir – 递归搜索 dir 中匹配 pattern 的内容

find . -name '*.htm' | xargs  perl -pi -e 's|old|new|g'
find . -type f -name "*.log" | xargs grep "ERROR" : 从当前目录开始查找所有扩展名为.log的文本文件，并找出包含”ERROR”的行
find . -name dfc.properties
delete file except notDelete.txt: find . -type f -not -name notDelete.txt | xargs rm
替换多文件中的内容
find . -name '*.htm' | xargs sed -n '/old/p'  (查询个数)
find . -name '*.htm' | xargs sed -i 's/old/new/g' (替换或者 s#old#new#g)
删除.svn文件夹
find . -type d -name ".svn" | xargs rm -rf
find . -name "*.svn"  | xargs rm -rf  或
find . -type d -iname ".svn" -exec rm -rf {} \;

多目录重命名文件 
for file in `find . -name 'sync1.properties'`; do echo $file; done
for i in `find . -name sync1.properties`; do mv $i `echo $i | sed 's/sync1.properties$/sync.properties/'`; done
```

查找包含class的jar文件 find . -iname \*.jar | while read JARF; do jar tvf $JARF | grep CaraCustomActionsFacade.class && echo $JARF ; done
find . -iname \*.jar | while read JARF; do /app/java/jdk1.6.0_35/bin/jar tvf $JARF | grep FunctionName.class && echo $JARF ; done
 
## xargs
xargs 工具的经典用法示例 
```
find some-file-criteria some-file-path | xargs some-great-command-that-needs-filename-arguments
kill -9 `ps -ef |grep GA | grep -v grep | awk '{print $2}'`
kill $(ps -aef | grep java | grep apache-tomcat-7.0.27 | awk '{print $2}')
kill -9 `netstat -ap |grep 6800 |awk '{print $7}'|awk -F "/" '{print $1}'`
```

## shell

xargs echo
在bash的脚本中，你可以使用 set -x 来debug输出。使用 set -e 来当有错误发生的时候abort执行。考虑使用 set -o pipefail 来限制错误。还可以使用trap来截获信号（如截获ctrl+c）。
在bash 脚本中，subshells (写在圆括号里的) 是一个很方便的方式来组合一些命令。一个常用的例子是临时地到另一个目录中

## bash
- `man readline` 查看 Bash 中的默认快捷键

### Emacs style key-bindings
if you love vi-style key-bindings, use `set -o vi` (and `set -o emacs` to put it back).
^u remove line command
^T It will reverse two characters
^Q Windows vi region select
编辑命令
    * Ctrl + a ：移到命令行首
    * Ctrl + e ：移到命令行尾
    * Alt + f ：按单词前移（右向）
    * Alt + b ：按单词后移（左向）
    * Ctrl + xx：在命令行首和光标之间移动
    * Ctrl + u ：从光标处删除至命令行首
    * Ctrl + k ：从光标处删除至命令行尾
    * Ctrl + w ：从光标处删除至字首
    * Alt + d ：从光标处删除至字尾
    * Ctrl + d ：删除光标处的字符
    * Ctrl + h ：删除光标前的字符
    * Ctrl + y ：粘贴至光标后
    * Alt + c ：从光标处更改为首字母大写的单词
    * Alt + u ：从光标处更改为全部大写的单词
    * Alt + l ：从光标处更改为全部小写的单词
    * Ctrl + t ：交换光标处和之前的字符
    * Alt + t ：交换光标处和之前的单词
    * Alt + Backspace：与 Ctrl + w 相同类似，分隔符有些差别 [感谢 rezilla 指正]
重新执行命令
    * Ctrl + r：逆向搜索命令历史
    * Ctrl + g：从历史搜索模式退出
    * Ctrl + p：历史中的上一条命令
    * Ctrl + n：历史中的下一条命令
    * Alt + .：使用上一条命令的最后一个参数
控制命令
    * Ctrl + l：清屏
    * Ctrl + o：执行当前命令，并选择上一条命令 循环执行历史命令
    * Ctrl + s：阻止屏幕输出
    * Ctrl + q：允许屏幕输出
    * Ctrl + c：终止命令
    * Ctrl + z：挂起命令
Bang (!) 命令
    * !!：执行上一条命令
    * sudo !!	以root的身份执行上一条命令
    * !blah：执行最近的以 blah 开头的命令，如 !ls
    * !blah:p：仅打印输出，而不执行
    * !$：上一条命令的最后一个参数，与 Alt + . 相同
    * echo !!:1	to call 1st arg
    * echo !!:2	to call 2nd arg
    * echo $?	获取上一次命令执行的结果，0表示成功，非0表示失败
    * !$:p：打印输出 !$ 的内容
    * !*：上一条命令的所有参数
    * !*:p：打印输出 !* 的内容
    * ^blah：删除上一条命令中的 blah
    * ^blah^foo：将上一条命令中的 blah 替换为 foo
    * ^blah^foo^：将上一条命令中所有的 blah 都替换为 foo
    * ^old^new^  或者 !!:s/old/new/ !!:gs/old/new 替换上一条命令中的一个短语 old替换成new

友情提示：
   1. 以上介绍的大多数 Bash 快捷键仅当在 emacs 编辑模式时有效，若你将 Bash 配置为 vi 编辑模式，那将遵循 vi 的按键绑定。Bash 默认为 emacs 编辑模式。如果你的 Bash 不在 emacs 编辑模式，可通过 set -o emacs 设置。
	For editing long commands, after setting your editor (for example export EDITOR=vim), ctrl-x ctrl-e will open the current command in an editor for multi-line editing. Or in vi style, escape-v.
   2. `^S、^Q、^C、^Z` 是由终端设备处理的，可用 stty 命令设置。
   3.  用C-p取出历史命令列表中某一个命令后, 按C-o可以在这条命令到历史命令列表后面的命令之间循环执行命令, 比如历史命令列表中有50条命令, 后面三项分别是命令A, 命令B, 命令C, 用C-p取出命令A后, 再按C-o就可以不停的在命令A, 命令B, 命令C中循环执行这三个命令. C-o有一个非常好用的地方, 比如用cp命令在拷贝一个大目录的时候, 你肯定很想知道当前的拷贝进度, 那么你现在该怎样做呢? 估计很多人会想到不停的输入du -sh dir去执行, 但用C-o可以非常完美的解决这个问题, 方法就是:
    输入du -sh dir, 按回车执行命令
    C-p, C-o, 然后就可以不停的按C-o了, 会不停的执行du -sh dir这条命令  like watch -n 1 -d du -sh dir
	其实上面这个问题也可以用watch命令解决: watch -n 10 -d du -sh /app/data/nas/gdms/
   4. 使用 Ctrl-r 而不是上下光标键来查找历史命令

alt+.把上一条命令的最后一个参数输入到当前命令行. 非常非常之方便, 强烈推荐. 如果继续按alt+., 会把上上条命令的最后一个参数拿过来. 同样, 如果你想把上一条命令第一个参数拿过来咋办呢? 用alt+0 alt+., 就是先输入alt+0, 再输入alt+.. 如果是上上条命令的第一个参数呢? 当然是alt+0 alt+. alt+.了.
undo 	C-/

### bash profile
bash Startup Files: it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile
 You only want to see it on login, so you only want to place this in your .bash_profile. If you put it in your .bashrc, you’d see it every time you open a new terminal window.
add  one line in .profile
alias ls='ls --color=never'
add one line in .bashrc
.bashrc:  alias grep='grep --color=auto'

### file carriage
在Linux下使用vi来查看一些在Windows下创建的文本文件，有时会发现在行尾有一些“^M”。有几种方法可以处理,注意：这里的“^M”要使用“CTRL-V CTRL-M”生成，而不是直接键入“^M”。 
1. $ dos2unix myfile.txt
2. vi :%s/^M$//g # 去掉行尾的^M。
	:%s/^M//g # 去掉所有的^M。
3. sed -e 's/^M//n/g' myfile.txt // evluate
 sed -i 's/^M//n/g' myfile.txt // replace


## zip/jar 
ps -ef | grep gdms | grep jboss
unzip gdms.war WEB-INF/lib/gdms.jar only unzip the jar from the war
unzip -l gdms.war | grep jaxen
unzip -l archive.zip lists the contents of a ZIP archive to ensure your file is inside.
unzip -c archive.zip file1.txt file2.txt | less :Use the -c option to write the contents of named files to stdout (screen) without having to uncompress the entire archive.
unzip -O cp936 fix linux下文件解压乱码
convmv -f 源编码 -t 新编码 [选项] 文件名 # linux文件名编码批量转换
zip -u gdms.war WEB-INF/lib/jaxen-core.jar update zip file
zip -d gdms.war WEB-INF/lib/jaxen-core.jar

jar tvf <filename>.jar to find the content of the file without extracting.
jar tvf classes.zip | grep DctmUtil
extract the class files in the jar
jar xvf <jar name>.jar [class name]
jar xvf gdmsSM.jar com/vdm/Method.class
update files
cd C:\sp\Workspace\gdms\gdmsSMr4p5\bin\classes
jar uvf C:\gdmsSM.jar com\vdm\Method.class com\vdm\UtilsG.class
jar uvf C:\gdmsSM.jar -C backup config.properties; add config.properties without backup folder path into jar
java -classpath .;jdom.jar;jPDFNotesS.jar com.PDFFrame  (linux 下用 :)
java命令引入jar时可以-cp参数，但-cp不能用通配符(JDK 5中多个jar时要一个个写,不能*.jar)，通常的jar都在同一目录，且多于1个
如：java -Djava.ext.dirs=lib MyClass

## mail
mail -s "subject" -a /opt/attachment.txt <EMAIL> < /dev/null
mail -s "Got permission" <EMAIL> < /dev/null
mutt -s "Sample" -a /file/path/file <EMAIL> < /tmp/msg	send email
mutt -s "gpseqnum" -a gpseqnumInUsed.csv.zip <EMAIL> < /tmp/msg	send email
sendmail <EMAIL>  < /tmp/email.txt

## help
help命令用来描述不同的内置Bash命令help –s printf
open another terminal: gnome-terminal
man -k or apropos: key words search for command
find out which command shell executes and to print binary(command) file location for specified command: which, whereis, type -a
locate indexserverconfig.xml

## Other
查看最后一个日志文件cat /app/dmfdev08/dba/log/0001d795/bp/`ls -tr /app/dmfdev08/dba/log/0001d795/bp | tail -1`
sudo usermod -a -G vboxsf your_user_name	# add user to group vboxsf
cat << EOF > test.txt
ABC
DEF
EOF
tar -jxvf firefox-37.0.2.tar.bz2 -C /opt/ -C 选项提取文件到指定目录
cd - 切换回上一个目录
wget是linux最常用的下载命令
tnsping MDATADEV.PFIZER.COM
使用一个命令来定义复杂的目录树mkdir -p project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}
ps aux or ps -ef | grep
ps aux | sort -nk +4 | tail	列出头十个最耗内存的进程
top - Process Activity Command
vmstat - System Activity, Hardware and System Information
w - Find Out Who Is Logged on And What They Are Doing
uptime - Tell How Long The System Has Been Running
free - Memory Usage
iostat - Average CPU Load, Disk Activity
sar - Collect and Report System Activity
pmap - Process Memory Usage
watch -d -n 1 'df; ls -FlAt /path' 实时某个目录下查看最新改动过的文件
watch -n 3 ls 以3秒钟执行一个ls命令
du -sh dirname 查看目录的大小
du -h --max-depth=1 显示当前目录中所有子目录的大小
du -s * | sort -n | tail	列出当前目录里最大的10个文件。
source .profile 使profile改动生效
ntsysv 就会*出图形界面给你选择(有的则显示在里面)，如果在文本界面就用ntsysv命令
less /etc/*-release: find system version
uname -a	# find out kernel versiontree directory
常见的场景是由于某种原因 ls 无法使用(内存不足、动态连接库丢失等等), 因为shell通常可以做*扩展，所以我们可以用 `echo * == ls`

# Advanced command

## awk
length( 字符串 ) : 返回该字符串的长度.
substr( 字符串,起始位置,长度) 
grep HeaderBean httpDailyFile.log.2015-02-21.log | awk '{print substr($3,length($3)-11-12,13)}' |less 

awk <pattern> '{print <stuff>}' <file> 可以用来删掉所有空行
Print every line that has at least one field: awk 'NF > 0' data
其中单引号中的被大括号括着的就是awk的语句，注意，其只能被单引号包含。其中的$1..$n表示第几例。注：$0表示整个行。
过滤记录
awk '$3==0 && $6=="LISTEN" ' netstat.txt 其中的“==”为比较运算符。其他比较运算符：!=, >, <, >=, <=
如果我们需要表头的话，我们可以引入内建变量NR：awk '$3==0 && $6=="TIME_WAIT" || NR==1 ' netstat.txt 

## sed
``` bash
grep -l old *.htm | xargs sed -n "/old/p"  (sed -n '/old/p' 查询个数; sed -i 's/old/new/g' 替换)
sed -n '/old/p' `grep -l old *.htm`
sed -i 's/package com.pfizer.gdms.tools;//g' ../*/ExportGtcConfigFile.java
sed -i 's#../../gxt#../../gxt2#g' */*.html

:%s#":.*$#gc
sed -i 's#":.*$#;//#g' test
sed -i 's#":.*//#;//#g' test
sed -i 's#":#;//#g' test
sed -i 's#"#private String #g' test

sed -i 's#\s`#private String #g' test
sed -i 's#`\(.*\)COMMENT#;//#g' test
sed -i "s#'##g" test
sed -i "s#,##g" test

删除行尾空格：:%s/\s+$//g
删除行首多余空格：%s/^\s*// 或者 %s/^ *//
删除沒有內容的空行：%s/^$// 或者 g/^$/d
删除包含有空格组成的空行：%s/^\s*$// 或者 g/^\s*$/d
删除以空格或TAB开头到结尾的空行：%s/^[ |\t]*$// 或者 g/^[ |\t]*$/d
替换变量:在正则式中以\(和\)括起来的正则表达式，在后面使用的时候可以用\1、\2等变量来访问\(和\)中的内容。
把文中的所有字符串“abc……xyz”替换为“xyz……abc”可以有下列写法
    :%s/abc\(.*\)xyz/xyz\1abc/g
    :%s/\(abc\)\(.*\)\(xyz\)/\3\2\1/g
把ABC转换为小写
    echo "ABC" | sed 's/[A-Z]*/\L&\E/' 或
    echo "ABC" | sed 's/[A-Z]/\l&/g'
    把abc转换为大写
    echo "abc" | sed 's/[a-z]*/\U&\E/' 或
    echo "abc" | sed 's/[a-z]/\u&/g'

    echo "ab_c" | sed 's/_[a-z]/\u&/g'
    echo "ab_c" | sed 's/_[a-z]/\U&\E/g'
	‘s/[ ] [ ] [ ] */[ ]/g’ 删除一个以上空格，用一个空格代替
	‘s/^[ ][ ] *//g’ 删除行首空格
	‘s/\ .[ ][ ] */[ ]/g’ 删除句点后跟两个或更多空格，代之以一个空格
	‘s/\ . $//g’ 删除以句点结尾行
	‘-e/abcd/d’ 删除包含a b c d的行
	‘/^ $/d’ 删除空行
	‘s/^ .//g’ 删除第一个字符
	‘s/COL \ ( . . . \ )//g’ 删除紧跟C O L的后三个字母
	‘s/^ \///g’ 从路径中删除第一个\
	‘s/[ ]/[TAB]//g’ 删除所有空格并用tab键替代
	‘S/^ [TAB]//g’ 删除行首所有tab键
	‘s/[TAB] *//g’ 删除所有tab键   
```

## Tmux 
tmux	CRTL-b
tmux使用C/S模型构建，主要包括以下单元模块：
    server服务器。输入tmux命令时就开启了一个服务器。
    session会话。一个服务器可以包含多个会话
    window窗口。一个会话可以包含多个窗口。
    pane面板。一个窗口可以包含多个面板。
tmux ls #列出会话
tmux a[ttach] -t session

### session operation：
:new	create new session(:new -s sessionName)
? 列出所有快捷键；按q返回
d 脱离当前会话,可暂时返回Shell界面，输入tmux a[ttach]能够重新进入之前会话
s 选择并切换会话；在同时开启了多个会话时使用
$ Rename the current session

### window operation
c 创建一个新的窗口
w 以菜单方式显示及选择窗口
n(到达下一个窗口) p(到达上一个窗口)
& 关掉当前窗口，也可以输入 exit
, Rename the current window.

### panel operation
" 将当前面板上下分屏
% 将当前面板左右分屏
x 关闭当前面板
<光标键> 移动光标选择对应面板
! 将当前面板置于新窗口,即新建一个窗口,其中仅包含当前面板
Ctrl+b+o交换两个panel位置
space 调整panel摆放方式
Ctrl+方向键 	以1个单元格为单位移动边缘以调整当前面板大小
Alt+方向键 	以5个单元格为单位移动边缘以调整当前面板大小

### Example: tmux scripts:
``` shell
#!/bin/bash
SESSION=Redis

	# Setup a session and setup a window for redis
tmux -2 new-session -d -s $SESSION -n $SESSION
tmux split-window -h
tmux select-pane -t 0
tmux send-keys "cd ~/opt/redis-sentinel" C-m
tmux send-keys "startRedisMaster6380.sh" C-m
tmux select-pane -t 1
tmux send-keys "cd ~/opt/redis-sentinel" C-m
tmux send-keys "startRedisSlave6381.sh" C-m
tmux split-window -v
tmux select-pane -t 2
tmux send-keys "cd ~/opt/redis-sentinel" C-m
tmux send-keys "startRedisSlave6382.sh" C-m

	#tmux new-window -t $WINDOW2:1 -n $WINDOW2
```

## screen 
screen vi test.c
screen -ls
screen -r PID
可以通过C-a ?来查看所有的键绑定，常用的键绑定有：
C-a ?	显示所有键绑定信息
C-a w	显示所有窗口列表
C-a C-a	切换到之前显示的窗口
C-a c	创建一个新的运行shell的窗口并切换到该窗口
C-a n	切换到下一个窗口
C-a p	切换到前一个窗口(与C-a n相对)
C-a 0..9	切换到窗口0..9
C-a a	发送 C-a到当前窗口
C-a d	暂时断开screen会话
C-a k	杀掉当前窗口
C-a [	进入拷贝/回滚模式
-c file	使用配置文件file，而不使用默认的$HOME/.screenrc
screen -wipe命令清除死掉的会话

## Python
The command to print a prompt to the screen and to store the resulting input into a variable named var is:
var = raw_input('Prompt')
python -m SimpleHTTPServer  HTTP服务在8000号端口上侦听

# Programs

## Software List
chromium browser
screenshot: shutter,deepin-scrot

ubuntu上如何使用郵箱客戶端去接收發送outlook exchange 郵件？ 試試 thunderbird + exquilla 插件
HTTPS://HELP.UBUNTU.COM/COMMUNITY/THUNDERBIRDEXCHANGE
https://exquilla.zendesk.com/home
http://www.5dmail.net/html/2013-5-7/201357111547.htm

## JDK installation
1. 安装JDK
0.1 download
	wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u5-b13/jdk-8u5-linux-i586.tar.gz"
0.2 unzip: tar xzf jdk-8u5-linux-i586.tar.gz
0.3 check version: jdk1.8.0_05/bin/java -version

1.1. 下载Linux x86 jdk-6u26-linux-i586.bin：
	sudo cp Downloads/jdk-6u26-linux-i586.bin /opt
	cd /opt
	sudo chmod +x jdk-6u26-linux-i586.bin
1.2. 解压缩安装包进行安装sudo ./jdk-6u26-linux-i586.bin
1.3. 接下来要配置环境变量，修改profile文件。
	sudo gedit /etc/profile
	在文本中添加以下代码：
	# Sun JDK profile
	export JAVA_HOME=/opt/jdk1.6.0_26
	export JRE_HOME=/opt/jdk1.6.0_26/jre
	export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
	export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOME/bin
1.4. 还要修改另外一个文件environment：
	sudo gedit /etc/environment
	在文本中添加以下代码：
	# Sun JDK environment
	export JAVA_HOME=/opt/jdk1.6.0_26
	export JRE_Home=/opt/jdk1.6.0_26/jre
	export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
1.5. 手动配置JDK。
	sudo update-alternatives --install /usr/bin/java java /opt/jdk1.6.0_26/bin/java 300
	sudo update-alternatives --install /usr/bin/javac javac /opt/jdk1.6.0_26/bin/javac 300
1.6. 让系统使用我们安装的JDK。
	sudo update-alternatives --config java
1.7. 验证安装JDK是否成功。
	java –version

## eclipse installation
To install eclipse on ubuntu you need to download it first from http://www.eclipse.org/downloads/ Extract the downloaded file by right click on it and extract here or running the following:
	tar xzf dir/eclipse-SDK-3.3.1.1-linux-gtk.tar.gz
	Where eclipse-SDK-3.3.1.1-linux-gtk is your eclipse-SDK name with version and dir is the directory of eclipse-sdk.
	Now move it to the root directory. Apply the following command to do this.
		sudo mv dir/eclipse ~
	Now you are ready to configure your eclipse. To do this follow the following step by step...
		sudo mv eclipse /opt/
	Take care of the permissions:
		sudo chmod -R +r /opt/eclipse
		sudo chmod +x /opt/eclipse/eclipse
Create an executable in your path:
	sudo touch /usr/bin/eclipse
	sudo chmod 755 /usr/bin/eclipse

	sudo gedit /usr/bin/eclipse
	Copy the following content and save the file:
```shell
#!/bin/sh
export ECLIPSE_HOME="/home/peter/opt/eclipse"
$ECLIPSE_HOME/eclipse $*
```
Let’s also make eclipse executable everywhere by creating a symlink: 
sudo ln -s /usr/bin/eclipse /bin/eclipse 
Create the menu icon: sudo gedit /usr/share/applications/eclipse.desktop Type in this content and save:
```
[Desktop Entry]
Encoding=UTF-8
Name=eclipse
Comment=eclipse IDE
Exec=eclipse
Icon=/home/pu/opt/eclipse/icon.xpm
Terminal=false
Type=Application
Categories=GNOME;Application;Development;
StartupNotify=true
```
Run for the first time: eclipse -clean
You can now start Eclipse by simply typing eclipse in the terminal or from the GNOME menu Applications -> Programming -> Eclipse

update tooltips color
http://askubuntu.com/questions/70599/how-to-change-tooltip-background-color-in-unity
grep -r tooltip_[fb]g_color /usr/share/themes/Ambiance: find all files to update
update as below:
tooltip_bg_color #f5f5b5;
tooltip_fg_color #000000;

## Tomcat
export JPDA_ADDRESS=8000
catalina.sh jpda start
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8000,suspend=n -jar remoting-debug.jar
Listeningfor transport dt_socket at address: 8000

## Chinese input installation 
1.click dash home, search for "language support"
2.click "install/remove language" and add Chinese
3.click dash home, search for "keyboard input method"
4.under "input method",add Chinese input method
5.auto start it: system->administrator->language support->Keyboard input method system, choose ibus

## Wireshark
sudo apt-get install wireshark
sudo chmod 4711 `which dumpcap`

# Misc.

## Missing clock menu bar fix:
killall unity-panel-service

## Processing files and data
Reference: [Processing files and data](https://github.com/jlevy/the-art-of-command-line/blob/master/README.md#processing-files-and-data)

- To locate a file by name in the current directory, `find . -iname '*something*'` (or similar). To find a file anywhere by name, use `locate something` (but bear in mind `updatedb` may not have indexed recently created files).

- For general searching through source or data files (more advanced than `grep -r`), use [`ag`](https://github.com/ggreer/the_silver_searcher).

- To convert HTML to text: `lynx -dump -stdin`

- For Markdown, HTML, and all kinds of document conversion, try [`pandoc`](http://pandoc.org/).

- If you must handle XML, `xmlstarlet` is old but good.

- For JSON, use [`jq`](http://stedolan.github.io/jq/).

- For YAML, use [`shyaml`](https://github.com/0k/shyaml).

- For Excel or CSV files, [csvkit](https://github.com/onyxfish/csvkit) provides `in2csv`, `csvcut`, `csvjoin`, `csvgrep`, etc.

- For Amazon S3, [`s3cmd`](https://github.com/s3tools/s3cmd) is convenient and [`s4cmd`](https://github.com/bloomreach/s4cmd) is faster. Amazon's [`aws`](https://github.com/aws/aws-cli) and the improved [`saws`](https://github.com/donnemartin/saws) are essential for other AWS-related tasks.

- Know about `sort` and `uniq`, including uniq's `-u` and `-d` options -- see one-liners below. See also `comm`.

- Know about `cut`, `paste`, and `join` to manipulate text files. Many people use `cut` but forget about `join`.

- Know about `wc` to count newlines (`-l`), characters (`-m`), words (`-w`) and bytes (`-c`).

- Know about `tee` to copy from stdin to a file and also to stdout, as in `ls -al | tee file.txt`.

- Know that locale affects a lot of command line tools in subtle ways, including sorting order (collation) and performance. Most Linux installations will set `LANG` or other locale variables to a local setting like US English. But be aware sorting will change if you change locale. And know i18n routines can make sort or other commands run *many times* slower. In some situations (such as the set operations or uniqueness operations below) you can safely ignore slow i18n routines entirely and use traditional byte-based sort order, using `export LC_ALL=C`.

- Know basic `awk` and `sed` for simple data munging. For example, summing all numbers in the third column of a text file: `awk '{ x += $3 } END { print x }'`. This is probably 3X faster and 3X shorter than equivalent Python.

- To replace all occurrences of a string in place, in one or more files:
```sh
      perl -pi.bak -e 's/old-string/new-string/g' my-files-*.txt
```

- To rename many files at once according to a pattern, use `rename`. For complex renames, [`repren`](https://github.com/jlevy/repren) may help.
```sh
      # Recover backup files foo.bak -> foo:
      rename 's/\.bak$//' *.bak
      # Full rename of filenames, directories, and contents foo -> bar:
      repren --full --preserve-case --from foo --to bar .
```

- As the man page says, `rsync` really is a fast and extraordinarily versatile file copying tool. It's known for synchronizing between machines but is equally useful locally. It also is among the [fastest ways](https://web.archive.org/web/20130929001850/http://linuxnote.net/jianingy/en/linux/a-fast-way-to-remove-huge-number-of-files.html) to delete large numbers of files:
```sh
mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir
```

- Use `shuf` to shuffle or select random lines from a file.

- Know `sort`'s options. For numbers, use `-n`, or `-h` for handling human-readable numbers (e.g. from `du -h`). Know how keys work (`-t` and `-k`). In particular, watch out that you need to write `-k1,1` to sort by only the first field; `-k1` means sort according to the whole line. Stable sort (`sort -s`) can be useful. For example, to sort first by field 2, then secondarily by field 1, you can use `sort -k1,1 | sort -s -k2,2`.

- If you ever need to write a tab literal in a command line in Bash (e.g. for the -t argument to sort), press **ctrl-v** **[Tab]** or write `$'\t'` (the latter is better as you can copy/paste it).

- The standard tools for patching source code are `diff` and `patch`. See also `diffstat` for summary statistics of a diff and `sdiff` for a side-by-side diff. Note `diff -r` works for entire directories. Use `diff -r tree1 tree2 | diffstat` for a summary of changes. Use `vimdiff` to compare and edit files.

- For binary files, use `hd`, `hexdump` or `xxd` for simple hex dumps and `bvi` or `biew` for binary editing.

- Also for binary files, `strings` (plus `grep`, etc.) lets you find bits of text.

- For binary diffs (delta compression), use `xdelta3`.

- To convert text encodings, try `iconv`. Or `uconv` for more advanced use; it supports some advanced Unicode things. For example, this command lowercases and removes all accents (by expanding and dropping them):
```sh
      uconv -f utf-8 -t utf-8 -x '::Any-Lower; ::Any-NFD; [:Nonspacing Mark:] >; ::Any-NFC; ' < input.txt > output.txt
```

- To split files into pieces, see `split` (to split by size) and `csplit` (to split by a pattern).

- To manipulate date and time expressions, use `dateadd`, `datediff`, `strptime` etc. from [`dateutils`](http://www.fresse.org/dateutils).

- Use `zless`, `zmore`, `zcat`, and `zgrep` to operate on compressed files.

## System debugging
Reference:[System debugging](https://github.com/jlevy/the-art-of-command-line/blob/master/README.md#system-debugging)

- For web debugging, `curl` and `curl -I` are handy, or their `wget` equivalents, or the more modern [`httpie`](https://github.com/jakubroztocil/httpie).

- To know current cpu/disk status, the classic tools are `top` (or the better `htop`), `iostat`, and `iotop`. Use `iostat -mxz 15` for basic CPU and detailed per-partition disk stats and performance insight.

- For network connection details, use `netstat` and `ss`.

- For a quick overview of what's happening on a system, `dstat` is especially useful. For broadest overview with details, use [`glances`](https://github.com/nicolargo/glances).

- To know memory status, run and understand the output of `free` and `vmstat`. In particular, be aware the "cached" value is memory held by the Linux kernel as file cache, so effectively counts toward the "free" value.

- Java system debugging is a different kettle of fish, but a simple trick on Oracle's and some other JVMs is that you can run `kill -3 <pid>` and a full stack trace and heap summary (including generational garbage collection details, which can be highly informative) will be dumped to stderr/logs. The JDK's `jps`, `jstat`, `jstack`, `jmap` are useful. [SJK tools](https://github.com/aragozin/jvm-tools) are more advanced.

- Use `mtr` as a better traceroute, to identify network issues.

- For looking at why a disk is full, `ncdu` saves time over the usual commands like `du -sh *`.

- To find which socket or process is using bandwidth, try `iftop` or `nethogs`.

- The `ab` tool (comes with Apache) is helpful for quick-and-dirty checking of web server performance. For more complex load testing, try `siege`.

- For more serious network debugging, `wireshark`, `tshark`, or `ngrep`.

- Know about `strace` and `ltrace`. These can be helpful if a program is failing, hanging, or crashing, and you don't know why, or if you want to get a general idea of performance. Note the profiling option (`-c`), and the ability to attach to a running process (`-p`).

- Know about `ldd` to check shared libraries etc.

- Know how to connect to a running process with `gdb` and get its stack traces.

- Use `/proc`. It's amazingly helpful sometimes when debugging live problems. Examples: `/proc/cpuinfo`, `/proc/meminfo`, `/proc/cmdline`, `/proc/xxx/cwd`, `/proc/xxx/exe`, `/proc/xxx/fd/`, `/proc/xxx/smaps` (where `xxx` is the process id or pid).

- When debugging why something went wrong in the past, `sar` can be very helpful. It shows historic statistics on CPU, memory, network, etc.

- For deeper systems and performance analyses, look at `stap` ([SystemTap](https://sourceware.org/systemtap/wiki)), [`perf`](http://en.wikipedia.org/wiki/Perf_(Linux)), and [`sysdig`](https://github.com/draios/sysdig).

- Check what OS you're on with `uname` or `uname -a` (general Unix/kernel info) or `lsb_release -a` (Linux distro info).

- Use `dmesg` whenever something's acting really funny (it could be hardware or driver issues).

## Launcher customization
launcher icon path: ./local/share/applications
Globally in /usr/share/applications, locally in ~/.local/share/applications.
If you want to add a custom launcher, create it in ~/.local/share/applications, make it executable, drag and drop it on the launcher*, and finally pin it (right-click on the launcher item → Keep In Launcher).
make it executable

# System
## Kernel
Find Out If Running Kernel Is 32 Or 64 Bit (find out if my Linux server CPU can run a 64 bit kernel version (apps) or not)
	uname -a	print system information: 
Find Out CPU is 32bit or 64bit?
	grep flags /proc/cpuinfo 
	CPU Modes:
		lm flag means Long mode cpu - 64 bit CPU
		Real mode 16 bit CPU
		Protected Mode is 32-bit CPU

## Network
netstat -lntp 或者 ss -plat 检查哪些进程在监听端口（默认是检查 TCP 端口; 使用参数 -u 检查 UDP 端口）
netstat -anp | grep PORT: Listening open ports
$ netstat -anp | less
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 *:pssc                      *:*                         LISTEN      -   

设定 DNS 的 IP：/etc/resolv.conf
nameserver 192.168.1.1    

### Restart network
sudo service network-manager restart

### vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE   =   eth0   
ONBOOT   =   yes   
BOOTPROTO   =   static   
BROADCAST=192.168. 230.255
IPADDR=   192.168.230.160 (你需要的固定ip)   
NETMASK=255.255.255.0
NETWORK=192.168.1.0
TYPE=Ethernet
<commit_msg>Revert "Replace line delimeters to Windows style"<commit_after>[TOC]
学习系统结构的最好方法是自己做一个linux系统，再也没有什么能比自己做一个linux系统更能学习系统结构的了。LFS (linux from strach)可以教你从源代码自己编译一个系统。通过自己编译一个系统，你就可以了结linux系统结构，知道哪些文件是干什么用的，以及他们如何协调 工作。
Linux内核设计与实现 Linux Kernel Development(Third Edition)-Robort Love

shortcuts:
^Z jobs fg(前台运行)， bg(后台运行)
vimtutor: vim interactive guide
Ctrl+h: show hidden files
nautilus: open your home folder
location: make a command can be call anywhere

# Basic Command
## VI
```
:set nu / :set nonu	(不)列出行号 (nu为行数)
:set ic / :set noic	vi在查找过程中(不)区分大小写 :set ignorecase/:set noignorecase
~	切换大小写
:sp	^Z jobs fg 
dt"  删除所有的内容，直到遇到"
改变与替换操作命令 
<r> 替换光标所在的字符 
<R> 替换字符序列 
<cw> 替换一个单词 
<ce> 同<cw> 
<cb> 替换光标所在的前一字符 
<c$> 替换自光标位置至行尾的所有字符 
<C> 同<c$> 
<cc> 替换当前行
read -p "Press enter to continue"
read -n 1 -p "Press any key to continue"
sleep 2; echo 'end sleep 2 sec

zoom in on your terminal with Ctrl+Shift++.
Zoom out with Ctrl+-

:x == :wq 当文件被修改时两个命令时相同的。但如果未被修改，使用 :x 不会更改文件的修改时间，而使用 :wq 会改变文件的修改时间
:w !sudo tee %  在VIM中保存一个当前用户无权限修改的文件
. 命令重复上次的修改。
:! command allows you to enter the name of a shell command
修改在这里就是插入、删除或者替换文本。能够重复是一个非常强大的机制。如果你基于它来安排你的编辑，许多修改将变得只是敲.键。留意其间的其他修改，因为它会替代你原来要重复的修改。相反，你可以用m命令先标记这个位置，继续重复你的修改，稍后再返回到这个位置。
重复修改一个单词。
如果是在整个文件中，你可以使用:s（substitute）命令。如果只是几个地方需要修改，一种快速的方法是使用 * 命令去找到下一个出现的单词，使用cw命令修改它。然后输入n去找到下一个单词，输入英文逗点 . 去重复cw命令。
删除多行
1. 如果要删除的段落的下一行是空行 一般用d} , 按两个键就可以了 多段的时候再按 .
2. 如果要删除的段落的下一行不是空行 则很容易找到该行的模式， 如该行存在function字串 一般 d/fu 也就搞定了


yw 只有当当前光标处于单词的第一个字母时才是“复制整个单词”(包含末尾的空格)，而 yiw 不管当前光标处于单词的哪个字母，都是复制整个单词(不包括末尾的空格)
输入单词A的前几个字母，然后ctrl+N补全。<C-o><C-n> <C-o><C-p> 只是简单的上下文补全，还有<C-o><C-f> 用于对目录名进行补全
guw	光标下的单词变为小写
gUw	光标下的单词变为大写
ga	显示光标下的字符在当前使用的encoding下的内码

### 文件对比 合并 多窗口
diff -u
vimdiff  FILE_LEFT  FILE_RIGHT
:qa (quit all)同时退出两个文件
:wa (write all)
:wqa (write, then quit all)
:qa! (force to quit all)

Ctrl-w K(把当前窗口移到最上边)
Ctrl-w H(把当前窗口移到最左边)
Ctrl-w J(把当前窗口移到最下边)
Ctrl-w L(把当前窗口移到最右边)
ctrl-w,r 交换上/下、左/右两个分隔窗口的位置
其中2和4两个操作会把窗口改成垂直分割方式。
在两个文件之间来回跳转，可以用下列命令序列Ctrl-w, w
可以使用快捷键在各个差异点之间快速移动。跳转到下一个差异点：]c. 反向跳转是：[c
> -+ 调整窗口大小

dp (diff "put") 把一个差异点中当前文件的内容复制到另一个文件里
do (diff "get"，之所以不用dg，是因为dg已经被另一个命令占用了)把另一个文件的内容复制到当前行
:diffu[pdate] #更新diff 修改文件后，vimdiff会试图自动来重新比较文件，来实时反映比较结果。但是也会有处理失败的情况，这个时候需要手工来刷新比较结果：
zo (folding open，之所以用z这个字母，是因为它看上去比较像折叠着的纸) 展开被折叠的相同的文本行
zc (folding close)重新折叠
```

### Mutiple tab
:n next file :p previous file
:bn 和 :bp :n 使用这两个命令来切换下一个或上一个文件。（陈皓注：我喜欢使用:n到下一个文件）

### Replace
:g/old			查找old，并打印出现它的每一行
:s/old/new		替换当前行第一个old
:s/old/new/gc	当前行old全替换并需要确认
:n,ms/old/new/g	n,m are the line numbers; n can be (.), which represent current line
:%s/old/new/gc	全文替换,也可用1,$表示从第一行到文本结束
:%s/^ *//gc		去掉所有的行首空格
/可以用#代替, 
:s：等同于 :s//~/，即会重复上一次替换
:& repeat last :s command
:g/^\s*$/d	delete the blank lines
:%s/\s\s/\t/gc	convert two space(\s\s) to tab(\t)
:%s/\s\+/,/g	use a substitution (:s///) over each line (%) to replace all (g) continuous whitespace (\s\+) with a comma (,).
pattern [^0-9]*,	matches string start with non-number until to (,)

### custom keyboard shortcut
inoremap jj <ESC>	# Remap Your ESCAPE Key in Vim
nnoremap j VipJ
:sh	暂时退出vi到系统下，结束时按Ctrl + d则回到vi
:r!command	将命令command的输出结果放到当前行【强大】
diw	删除当前光标所在的word(不包括空白字符)，意为Delete Inner Word 两个符号之间的单词
daw	删除当前光标所在的word(包括空白字符)，意为Delete A Word
:map	列出当前已定义的映射
 

### VI正则表达式
元字符 	说明
. 	匹配任意字符
[abc] 	匹配方括号中的任意一个字符，可用-表示字符范围。如[a-z0-9]匹配小写字母和数字
[^abc] 	匹配除方括号中字符之外的任意字符
\d 	匹配阿拉伯数字，等同于[0-9]
\D 	匹配阿拉伯数字之外的任意字符，等同于[^0-9]
\x 	匹配十六进制数字，等同于[0-9A-Fa-f]
\X 	匹配十六进制数字之外的任意字符，等同于[^0-9A-Fa-f]
\l 	匹配[a-z]
\L 	匹配[^a-z]
\u 	匹配[A-Z]
\U 	匹配[^A-Z]
\w 	匹配单词字母，等同于[0-9A-Za-z_]
\W 	匹配单词字母之外的任意字符，等同于[^0-9A-Za-z_]
\t 	匹配<TAB>字符
\s 	匹配空白字符，等同于[\t]
\S 	匹配非空白字符，等同于[^\t]

一些普通字符需转意
元字符 	说明
\* 	匹配* 字符
. 	匹配. 字符
\/ 	匹配 / 字符
\ 	匹配 \ 字符
\[ 	匹配 [ 字符
\] 	匹配 ] 字符

表示数量的元字符
元字符 	说明
* 	匹配0-任意个
\+ 	匹配1-任意个
\? 	匹配0-1个
\{n,m} 	匹配n-m个
\{n} 	匹配n个
\{n,} 	匹配n-任意个
\{,m} 	匹配0-m个

表示位置的元字符
元字符 	说明
$ 	匹配行尾
^ 	匹配行首
\< 	匹配单词词首
\> 	匹配单词词尾


## find grep sed
```
grep pattern files – 搜索 files 中匹配 pattern 的内容
grep -r pattern dir – 递归搜索 dir 中匹配 pattern 的内容
grep -l old *.htm | xargs sed -n "/old/p"  (sed -n '/old/p' 查询个数; sed -i 's/old/new/g' 替换)
sed -n '/old/p' `grep -l old *.htm`
sed -i 's/package com.pfizer.gdms.tools;//g' ../*/ExportGtcConfigFile.java
sed -i 's#../../gxt#../../gxt2#g' */*.html

:%s#":.*$#gc
sed -i 's#":.*$#;//#g' test
sed -i 's#":.*//#;//#g' test
sed -i 's#":#;//#g' test
sed -i 's#"#private String #g' test

sed -i 's#\s`#private String #g' test
sed -i 's#`\(.*\)COMMENT#;//#g' test
sed -i "s#'##g" test
sed -i "s#,##g" test

删除行尾空格：:%s/\s+$//g
删除行首多余空格：%s/^\s*// 或者 %s/^ *//
删除沒有內容的空行：%s/^$// 或者 g/^$/d
删除包含有空格组成的空行：%s/^\s*$// 或者 g/^\s*$/d
删除以空格或TAB开头到结尾的空行：%s/^[ |\t]*$// 或者 g/^[ |\t]*$/d
替换变量:在正则式中以\(和\)括起来的正则表达式，在后面使用的时候可以用\1、\2等变量来访问\(和\)中的内容。
把文中的所有字符串“abc……xyz”替换为“xyz……abc”可以有下列写法
    :%s/abc\(.*\)xyz/xyz\1abc/g
    :%s/\(abc\)\(.*\)\(xyz\)/\3\2\1/g
把ABC转换为小写
    echo "ABC" | sed 's/[A-Z]*/\L&\E/' 或
    echo "ABC" | sed 's/[A-Z]/\l&/g'
    把abc转换为大写
    echo "abc" | sed 's/[a-z]*/\U&\E/' 或
    echo "abc" | sed 's/[a-z]/\u&/g'

    echo "ab_c" | sed 's/_[a-z]/\u&/g'
    echo "ab_c" | sed 's/_[a-z]/\U&\E/g'
	‘s/[ ] [ ] [ ] */[ ]/g’ 删除一个以上空格，用一个空格代替
	‘s/^[ ][ ] *//g’ 删除行首空格
	‘s/\ .[ ][ ] */[ ]/g’ 删除句点后跟两个或更多空格，代之以一个空格
	‘s/\ . $//g’ 删除以句点结尾行
	‘-e/abcd/d’ 删除包含a b c d的行
	‘/^ $/d’ 删除空行
	‘s/^ .//g’ 删除第一个字符
	‘s/COL \ ( . . . \ )//g’ 删除紧跟C O L的后三个字母
	‘s/^ \///g’ 从路径中删除第一个\
	‘s/[ ]/[TAB]//g’ 删除所有空格并用tab键替代
	‘S/^ [TAB]//g’ 删除行首所有tab键
	‘s/[TAB] *//g’ 删除所有tab键

find . -name '*.htm' | xargs  perl -pi -e 's|old|new|g'
find . -type f -name "*.log" | xargs grep "ERROR" : 从当前目录开始查找所有扩展名为.log的文本文件，并找出包含”ERROR”的行
find . -name dfc.properties
delete file except notDelete.txt: find . -type f -not -name notDelete.txt | xargs rm
替换多文件中的内容
find . -name '*.htm' | xargs sed -n '/old/p'  (查询个数)
find . -name '*.htm' | xargs sed -i 's/old/new/g' (替换或者 s#old#new#g)
删除.svn文件夹
find . -type d -name ".svn" | xargs rm -rf
find . -name "*.svn"  | xargs rm -rf  或
find . -type d -iname ".svn" -exec rm -rf {} \;

多目录重命名文件 
for file in `find . -name 'sync1.properties'`; do echo $file; done
for i in `find . -name sync1.properties`; do mv $i `echo $i | sed 's/sync1.properties$/sync.properties/'`; done
```

查找包含class的jar文件 find . -iname \*.jar | while read JARF; do jar tvf $JARF | grep CaraCustomActionsFacade.class && echo $JARF ; done
find . -iname \*.jar | while read JARF; do /app/java/jdk1.6.0_35/bin/jar tvf $JARF | grep FunctionName.class && echo $JARF ; done
 
## xargs
xargs 工具的经典用法示例 
```
find some-file-criteria some-file-path | xargs some-great-command-that-needs-filename-arguments
kill -9 `ps -ef |grep GA | grep -v grep | awk '{print $2}'`
kill $(ps -aef | grep java | grep apache-tomcat-7.0.27 | awk '{print $2}')
kill -9 `netstat -ap |grep 6800 |awk '{print $7}'|awk -F "/" '{print $1}'`
```
awk <pattern> '{print <stuff>}' <file> 可以用来删掉所有空行
Print every line that has at least one field: awk 'NF > 0' data
其中单引号中的被大括号括着的就是awk的语句，注意，其只能被单引号包含。其中的$1..$n表示第几例。注：$0表示整个行。
过滤记录
awk '$3==0 && $6=="LISTEN" ' netstat.txt 其中的“==”为比较运算符。其他比较运算符：!=, >, <, >=, <=
如果我们需要表头的话，我们可以引入内建变量NR：awk '$3==0 && $6=="TIME_WAIT" || NR==1 ' netstat.txt

## shell

xargs echo
在bash的脚本中，你可以使用 set -x 来debug输出。使用 set -e 来当有错误发生的时候abort执行。考虑使用 set -o pipefail 来限制错误。还可以使用trap来截获信号（如截获ctrl+c）。
在bash 脚本中，subshells (写在圆括号里的) 是一个很方便的方式来组合一些命令。一个常用的例子是临时地到另一个目录中

## bash
^u remove line command
^T It will reverse two characters
^Q Windows vi region select
Add comments for mutillines
	press Ctrl-V to enter visual block mode and press "down" until all the lines are marked. Then press I to insert at the beginning (of the block). The inserted characters will be inserted in each line at the left of the marked block.
编辑命令
    * Ctrl + a ：移到命令行首
    * Ctrl + e ：移到命令行尾
    * Alt + f ：按单词前移（右向）
    * Alt + b ：按单词后移（左向）
    * Ctrl + xx：在命令行首和光标之间移动
    * Ctrl + u ：从光标处删除至命令行首
    * Ctrl + k ：从光标处删除至命令行尾
    * Ctrl + w ：从光标处删除至字首
    * Alt + d ：从光标处删除至字尾
    * Ctrl + d ：删除光标处的字符
    * Ctrl + h ：删除光标前的字符
    * Ctrl + y ：粘贴至光标后
    * Alt + c ：从光标处更改为首字母大写的单词
    * Alt + u ：从光标处更改为全部大写的单词
    * Alt + l ：从光标处更改为全部小写的单词
    * Ctrl + t ：交换光标处和之前的字符
    * Alt + t ：交换光标处和之前的单词
    * Alt + Backspace：与 Ctrl + w 相同类似，分隔符有些差别 [感谢 rezilla 指正]
重新执行命令
    * Ctrl + r：逆向搜索命令历史
    * Ctrl + g：从历史搜索模式退出
    * Ctrl + p：历史中的上一条命令
    * Ctrl + n：历史中的下一条命令
    * Alt + .：使用上一条命令的最后一个参数
控制命令
    * Ctrl + l：清屏
    * Ctrl + o：执行当前命令，并选择上一条命令 循环执行历史命令
    * Ctrl + s：阻止屏幕输出
    * Ctrl + q：允许屏幕输出
    * Ctrl + c：终止命令
    * Ctrl + z：挂起命令
Bang (!) 命令
    * !!：执行上一条命令
    * !blah：执行最近的以 blah 开头的命令，如 !ls
    * !blah:p：仅打印输出，而不执行
    * !$：上一条命令的最后一个参数，与 Alt + . 相同
    * !$:p：打印输出 !$ 的内容
    * !*：上一条命令的所有参数
    * !*:p：打印输出 !* 的内容
    * ^blah：删除上一条命令中的 blah
    * ^blah^foo：将上一条命令中的 blah 替换为 foo
    * ^blah^foo^：将上一条命令中所有的 blah 都替换为 foo
$ ^old^new^  或者 !!:s/old/new/ !!:gs/old/new 替换上一条命令中的一个短语 old替换成new
!$	是一个特殊的环境变量，它代表了上一个命令的最后一个字符串
!!	Run the last command-name
sudo !!	以root的身份执行上一条命令
echo !!:1	to call 1st arg
echo !!:2	to call 2nd arg
echo $?	获取上一次命令执行的结果，0表示成功，非0表示失败

友情提示：
   1. 以上介绍的大多数 Bash 快捷键仅当在 emacs 编辑模式时有效，若你将 Bash 配置为 vi 编辑模式，那将遵循 vi 的按键绑定。Bash 默认为 emacs 编辑模式。如果你的 Bash 不在 emacs 编辑模式，可通过 set -o emacs 设置。
   2. ^S、^Q、^C、^Z 是由终端设备处理的，可用 stty 命令设置。
   3.  用C-p取出历史命令列表中某一个命令后, 按C-o可以在这条命令到历史命令列表后面的命令之间循环执行命令, 比如历史命令列表中有50条命令, 后面三项分别是命令A, 命令B, 命令C, 用C-p取出命令A后, 再按C-o就可以不停的在命令A, 命令B, 命令C中循环执行这三个命令. C-o有一个非常好用的地方, 比如用cp命令在拷贝一个大目录的时候, 你肯定很想知道当前的拷贝进度, 那么你现在该怎样做呢? 估计很多人会想到不停的输入du -sh dir去执行, 但用C-o可以非常完美的解决这个问题, 方法就是:
    输入du -sh dir, 按回车执行命令
    C-p, C-o, 然后就可以不停的按C-o了, 会不停的执行du -sh dir这条命令  like watch -n 1 -d du -sh dir
	其实上面这个问题也可以用watch命令解决: watch -n 10 -d du -sh /app/data/nas/gdms/
   4. 使用 Ctrl-r 而不是上下光标键来查找历史命令

alt+.把上一条命令的最后一个参数输入到当前命令行. 非常非常之方便, 强烈推荐. 如果继续按alt+., 会把上上条命令的最后一个参数拿过来. 同样, 如果你想把上一条命令第一个参数拿过来咋办呢? 用alt+0 alt+., 就是先输入alt+0, 再输入alt+.. 如果是上上条命令的第一个参数呢? 当然是alt+0 alt+. alt+.了.
undo 	C-/

### bash profile
bash Startup Files: it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile
 You only want to see it on login, so you only want to place this in your .bash_profile. If you put it in your .bashrc, you’d see it every time you open a new terminal window.
add  one line in .profile
alias ls='ls --color=never'
add one line in .bashrc
.bashrc:  alias grep='grep --color=auto'

### file carriage
在Linux下使用vi来查看一些在Windows下创建的文本文件，有时会发现在行尾有一些“^M”。有几种方法可以处理,注意：这里的“^M”要使用“CTRL-V CTRL-M”生成，而不是直接键入“^M”。 
1. $ dos2unix myfile.txt
2. vi :%s/^M$//g # 去掉行尾的^M。
	:%s/^M//g # 去掉所有的^M。
3. sed -e 's/^M//n/g' myfile.txt // evluate
 sed -i 's/^M//n/g' myfile.txt // replace


## zip/jar 
ps -ef | grep gdms | grep jboss
unzip gdms.war WEB-INF/lib/gdms.jar only unzip the jar from the war
unzip -l gdms.war | grep jaxen
unzip -l archive.zip lists the contents of a ZIP archive to ensure your file is inside.
unzip -c archive.zip file1.txt file2.txt | less :Use the -c option to write the contents of named files to stdout (screen) without having to uncompress the entire archive.
unzip -O cp936 fix linux下文件解压乱码
convmv -f 源编码 -t 新编码 [选项] 文件名 # linux文件名编码批量转换
zip -u gdms.war WEB-INF/lib/jaxen-core.jar update zip file
zip -d gdms.war WEB-INF/lib/jaxen-core.jar

jar tvf <filename>.jar to find the content of the file without extracting.
jar tvf classes.zip | grep DctmUtil
extract the class files in the jar
jar xvf <jar name>.jar [class name]
jar xvf gdmsSM.jar com/vdm/Method.class
update files
cd C:\sp\Workspace\gdms\gdmsSMr4p5\bin\classes
jar uvf C:\gdmsSM.jar com\vdm\Method.class com\vdm\UtilsG.class
jar uvf C:\gdmsSM.jar -C backup config.properties; add config.properties without backup folder path into jar
java -classpath .;jdom.jar;jPDFNotesS.jar com.PDFFrame  (linux 下用 :)
java命令引入jar时可以-cp参数，但-cp不能用通配符(JDK 5中多个jar时要一个个写,不能*.jar)，通常的jar都在同一目录，且多于1个
如：java -Djava.ext.dirs=lib MyClass

## mail
mail -s "subject" -a /opt/attachment.txt <EMAIL> < /dev/null
mail -s "Got permission" <EMAIL> < /dev/null
mutt -s "Sample" -a /file/path/file <EMAIL> < /tmp/msg	send email
mutt -s "gpseqnum" -a gpseqnumInUsed.csv.zip <EMAIL> < /tmp/msg	send email
sendmail <EMAIL>  < /tmp/email.txt

## help
help命令用来描述不同的内置Bash命令help –s printf
open another terminal: gnome-terminal
man -k or apropos: key words search for command
find out which command shell executes and to print binary(command) file location for specified command: which, whereis, type -a
locate indexserverconfig.xml

## Other
查看最后一个日志文件cat /app/dmfdev08/dba/log/0001d795/bp/`ls -tr /app/dmfdev08/dba/log/0001d795/bp | tail -1`
sudo usermod -a -G vboxsf your_user_name	# add user to group vboxsf
cat << EOF > test.txt
ABC
DEF
EOF
tar -jxvf firefox-37.0.2.tar.bz2 -C /opt/ -C 选项提取文件到指定目录
cd - 切换回上一个目录
wget是linux最常用的下载命令
tnsping MDATADEV.PFIZER.COM
使用一个命令来定义复杂的目录树mkdir -p project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}
ps aux or ps -ef | grep
ps aux | sort -nk +4 | tail	列出头十个最耗内存的进程
top - Process Activity Command
vmstat - System Activity, Hardware and System Information
w - Find Out Who Is Logged on And What They Are Doing
uptime - Tell How Long The System Has Been Running
free - Memory Usage
iostat - Average CPU Load, Disk Activity
sar - Collect and Report System Activity
pmap - Process Memory Usage
watch -d -n 1 'df; ls -FlAt /path' 实时某个目录下查看最新改动过的文件
watch -n 3 ls 以3秒钟执行一个ls命令
du -sh dirname 查看目录的大小
du -h --max-depth=1 显示当前目录中所有子目录的大小
du -s * | sort -n | tail	列出当前目录里最大的10个文件。
source .profile 使profile改动生效
ntsysv 就会*出图形界面给你选择(有的则显示在里面)，如果在文本界面就用ntsysv命令
less /etc/*-release: find system version
uname -a	# find out kernel versiontree directory
常见的场景是由于某种原因 ls 无法使用(内存不足、动态连接库丢失等等), 因为shell通常可以做*扩展，所以我们可以用 `echo * == ls`

# Advanced command
## Tmux 
tmux	CRTL-b
tmux使用C/S模型构建，主要包括以下单元模块：
    server服务器。输入tmux命令时就开启了一个服务器。
    session会话。一个服务器可以包含多个会话
    window窗口。一个会话可以包含多个窗口。
    pane面板。一个窗口可以包含多个面板。
tmux ls #列出会话
tmux a[ttach] -t session

### session operation：
:new	create new session(:new -s sessionName)
? 列出所有快捷键；按q返回
d 脱离当前会话,可暂时返回Shell界面，输入tmux a[ttach]能够重新进入之前会话
s 选择并切换会话；在同时开启了多个会话时使用
$ Rename the current session

### window operation
c 创建一个新的窗口
w 以菜单方式显示及选择窗口
n(到达下一个窗口) p(到达上一个窗口)
& 关掉当前窗口，也可以输入 exit
, Rename the current window.

### panel operation
" 将当前面板上下分屏
% 将当前面板左右分屏
x 关闭当前面板
<光标键> 移动光标选择对应面板
! 将当前面板置于新窗口,即新建一个窗口,其中仅包含当前面板
Ctrl+b+o交换两个panel位置
space 调整panel摆放方式
Ctrl+方向键 	以1个单元格为单位移动边缘以调整当前面板大小
Alt+方向键 	以5个单元格为单位移动边缘以调整当前面板大小

### Example: tmux scripts:
``` shell
#!/bin/bash
SESSION=Redis

# Setup a session and setup a window for redis
tmux -2 new-session -d -s $SESSION -n $SESSION
tmux split-window -h
tmux select-pane -t 0
tmux send-keys "cd ~/opt/redis-sentinel" C-m
tmux send-keys "startRedisMaster6380.sh" C-m
tmux select-pane -t 1
tmux send-keys "cd ~/opt/redis-sentinel" C-m
tmux send-keys "startRedisSlave6381.sh" C-m
tmux split-window -v
tmux select-pane -t 2
tmux send-keys "cd ~/opt/redis-sentinel" C-m
tmux send-keys "startRedisSlave6382.sh" C-m

#tmux new-window -t $WINDOW2:1 -n $WINDOW2
```

## screen 
screen vi test.c
screen -ls
screen -r PID
可以通过C-a ?来查看所有的键绑定，常用的键绑定有：
C-a ?	显示所有键绑定信息
C-a w	显示所有窗口列表
C-a C-a	切换到之前显示的窗口
C-a c	创建一个新的运行shell的窗口并切换到该窗口
C-a n	切换到下一个窗口
C-a p	切换到前一个窗口(与C-a n相对)
C-a 0..9	切换到窗口0..9
C-a a	发送 C-a到当前窗口
C-a d	暂时断开screen会话
C-a k	杀掉当前窗口
C-a [	进入拷贝/回滚模式
-c file	使用配置文件file，而不使用默认的$HOME/.screenrc
screen -wipe命令清除死掉的会话

## Python
The command to print a prompt to the screen and to store the resulting input into a variable named var is:
var = raw_input('Prompt')
python -m SimpleHTTPServer  HTTP服务在8000号端口上侦听

# Programs

## Software List
chromium browser
screenshot: shutter,deepin-scrot

ubuntu上如何使用郵箱客戶端去接收發送outlook exchange 郵件？ 試試 thunderbird + exquilla 插件
HTTPS://HELP.UBUNTU.COM/COMMUNITY/THUNDERBIRDEXCHANGE
https://exquilla.zendesk.com/home
http://www.5dmail.net/html/2013-5-7/201357111547.htm

## JDK installation
1. 安装JDK
0.1 download
	wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u5-b13/jdk-8u5-linux-i586.tar.gz"
0.2 unzip: tar xzf jdk-8u5-linux-i586.tar.gz
0.3 check version: jdk1.8.0_05/bin/java -version

1.1. 下载Linux x86 jdk-6u26-linux-i586.bin：
	sudo cp Downloads/jdk-6u26-linux-i586.bin /opt
	cd /opt
	sudo chmod +x jdk-6u26-linux-i586.bin
1.2. 解压缩安装包进行安装sudo ./jdk-6u26-linux-i586.bin
1.3. 接下来要配置环境变量，修改profile文件。
	sudo gedit /etc/profile
	在文本中添加以下代码：
	# Sun JDK profile
	export JAVA_HOME=/opt/jdk1.6.0_26
	export JRE_HOME=/opt/jdk1.6.0_26/jre
	export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
	export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOME/bin
1.4. 还要修改另外一个文件environment：
	sudo gedit /etc/environment
	在文本中添加以下代码：
	# Sun JDK environment
	export JAVA_HOME=/opt/jdk1.6.0_26
	export JRE_Home=/opt/jdk1.6.0_26/jre
	export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
1.5. 手动配置JDK。
	sudo update-alternatives --install /usr/bin/java java /opt/jdk1.6.0_26/bin/java 300
	sudo update-alternatives --install /usr/bin/javac javac /opt/jdk1.6.0_26/bin/javac 300
1.6. 让系统使用我们安装的JDK。
	sudo update-alternatives --config java
1.7. 验证安装JDK是否成功。
	java –version

## eclipse installation
To install eclipse on ubuntu you need to download it first from http://www.eclipse.org/downloads/ Extract the downloaded file by right click on it and extract here or running the following:
	tar xzf dir/eclipse-SDK-3.3.1.1-linux-gtk.tar.gz
	Where eclipse-SDK-3.3.1.1-linux-gtk is your eclipse-SDK name with version and dir is the directory of eclipse-sdk.
	Now move it to the root directory. Apply the following command to do this.
		sudo mv dir/eclipse ~
	Now you are ready to configure your eclipse. To do this follow the following step by step...
		sudo mv eclipse /opt/
	Take care of the permissions:
		sudo chmod -R +r /opt/eclipse
		sudo chmod +x /opt/eclipse/eclipse
Create an executable in your path:
	sudo touch /usr/bin/eclipse
	sudo chmod 755 /usr/bin/eclipse

	sudo gedit /usr/bin/eclipse
	Copy the following content and save the file:
```shell
#!/bin/sh
export ECLIPSE_HOME="/home/peter/opt/eclipse"
$ECLIPSE_HOME/eclipse $*
```
Let’s also make eclipse executable everywhere by creating a symlink: 
sudo ln -s /usr/bin/eclipse /bin/eclipse 
Create the menu icon: sudo gedit /usr/share/applications/eclipse.desktop Type in this content and save:
```
[Desktop Entry]
Encoding=UTF-8
Name=eclipse
Comment=eclipse IDE
Exec=eclipse
Icon=/home/pu/opt/eclipse/icon.xpm
Terminal=false
Type=Application
Categories=GNOME;Application;Development;
StartupNotify=true
```
Run for the first time: eclipse -clean
You can now start Eclipse by simply typing eclipse in the terminal or from the GNOME menu Applications -> Programming -> Eclipse

update tooltips color
http://askubuntu.com/questions/70599/how-to-change-tooltip-background-color-in-unity
grep -r tooltip_[fb]g_color /usr/share/themes/Ambiance: find all files to update
update as below:
tooltip_bg_color #f5f5b5;
tooltip_fg_color #000000;

## Tomcat
export JPDA_ADDRESS=8000
catalina.sh jpda start
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8000,suspend=n -jar remoting-debug.jar
Listeningfor transport dt_socket at address: 8000

## Chinese input installation 
1.click dash home, search for "language support"
2.click "install/remove language" and add Chinese
3.click dash home, search for "keyboard input method"
4.under "input method",add Chinese input method
5.auto start it: system->administrator->language support->Keyboard input method system, choose ibus

# Misc.

## Missing clock menu bar fix:
killall unity-panel-service

## Launcher customization
launcher icon path: ./local/share/applications
Globally in /usr/share/applications, locally in ~/.local/share/applications.
If you want to add a custom launcher, create it in ~/.local/share/applications, make it executable, drag and drop it on the launcher*, and finally pin it (right-click on the launcher item → Keep In Launcher).
make it executable

# System
## Kernel
Find Out If Running Kernel Is 32 Or 64 Bit (find out if my Linux server CPU can run a 64 bit kernel version (apps) or not)
	uname -a	print system information: 
Find Out CPU is 32bit or 64bit?
	grep flags /proc/cpuinfo 
	CPU Modes:
		lm flag means Long mode cpu - 64 bit CPU
		Real mode 16 bit CPU
		Protected Mode is 32-bit CPU

## Network
设定 DNS 的 IP：/etc/resolv.conf
nameserver 192.168.1.1
Listening open ports: netstat -an | grep PORT
$ netstat -ap | less
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 *:pssc                      *:*                         LISTEN      -       

### Restart network
sudo service network-manager restart

### vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE   =   eth0   
ONBOOT   =   yes   
BOOTPROTO   =   static   
BROADCAST=192.168. 230.255
IPADDR=   192.168.230.160 (你需要的固定ip)   
NETMASK=255.255.255.0
NETWORK=192.168.1.0
TYPE=Ethernet

{'fraction_non_alphanumeric': 0.12979215663779423, 'fraction_numerical': 0.016558634008298437, 'mean_word_length': 3.805218669606762, 'pattern_counts': {'":': 8, '<': 83, '<?xml version=': 0, '>': 88, 'https://': 18, 'lorem ipsum': 0, 'www.': 7, 'xml': 3}, 'pii_count': 12, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 20, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3784900', 'n_tokens_mistral': 26545, 'n_tokens_neox': 27797, 'n_words': 6185}