shell手冊--笨鳥傑做

============================================================================================================================php

09年,鳥人第四年linux環境,用ssh終端連上server,兩眼一黑(啥命令也不會).....html

每次把成老師在我電腦上操做的命令用history找到記錄下來,避免反覆問他一樣的問題...node

後來把工做中用到的新命令、從《shell編程..》學到的使用方法也記錄下來...python

因而,一個暫時的txt文件變成了現在這個樣子(平常命令差點兒都可以搜到)....mysql

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

#! /bin/sh
Shell腳本中用#表示凝視,至關於C語言的//凝視。

但假設#位於第一行開頭,並且是#!(稱爲Shebang)則例外,它表示該腳本使用後面指定的解釋器/bin/sh解釋運行。

shell凝視-->
    A、方法一
  :<<BLOCK'
  ....凝視內容
    'BLOCK
  B、方法二
  :<<'BLOCK
  ....凝視內容
  BLOCK'
  C、方法三

  :<<'
    ....凝視內容
    '
  以上三種方法都是經過在:<
  
  BLOCK爲Here Documents中的定義符號可以任意起名,僅僅要先後匹配便可了

    更帥的方法:
    cat <<"EOF" > /dev/null
    this
    is
    a
    multi-
    line
    comment
    EOF
    或者:
    : cat <<"EOF"
    this
    is
    a
    multi-
    line
    comment
    EOF        

<--shell凝視

eval的做用是再次運行命令行處理,也就是說,對一個命令行,運行兩次命令行處理。
eval echo "\$$#"  輸出最後一個參數。不用eval的話僅僅能輸出$number,還不是$number中存儲的數據

<getopts在 linux與unix shell編程指南 20.pdf>
getopts通常格式爲:
getopts option_string OPTION 將所有以連字符開頭的參數做爲變量與option_string對照,假設匹配成功。變量設置成OPTION的值,假設未發現匹配字符,把?設置成其值
getopts ahfvc: OPTION    選項a、h、f、v可以不加實際值進行傳遞,而選項c必須取

sort -u -n xx.log |wc -l

 du -sh * | sort -h  #sort -h --human-numeric-sort
              compare human readable numbers (e.g., 2K 1G)

ls /home/mysql/bigman/wom_weibo_sina* | xargs du -cb  統計指定文件的總大小
vi 中加入和去除行號
顯示行號    :set number     或 :set nu
去除行號    :set nonumber  或  :set nonu

vi中水平分頁編輯 :vsplit another_file
vi中豎直分頁編輯 :sp another_file
上述兩種,用ctrl+w+w進行切換

linux

vi中用標籤頁編輯 :android

:tabe[dit] another_file  
ios

向後切換 {num}gt  => gt3gt  4gt 5gt (帶數字的是以第一個標籤頁爲基準,而不是當前標籤頁爲基準)
c++

:tabn[ext] {num} =>:tabnext 2;:tabnext
git

向前切換 {num}gT => gT 3gT4gT 5gT (帶數據的是以當前標籤頁爲基準,不是以第一個標籤頁爲基準)

:tabN[ext] {num} =>:tabNext 2;:tabNext

切到第一個標籤頁 :tabfir[st]

切到最後一個標籤頁 :tabl[ast]

把當前標籤頁移到第N個標籤頁以後 :tabm[ove] [N] 

對所有標籤頁運行命令 :tabd[o] {cmd}

關閉標籤頁 :tabc[lose] {num}

關閉其它所有標籤頁 :tabonly

關閉所有標籤頁:qa

把複製(yank)的文本粘貼到文件裏用p便可了(要粘貼到上一行用P),那麼假設要粘貼到:命令行裏面呢--> ctrl+r " 


一次性打開多個文件用標籤頁編輯 vi -p one_file anther_file third_file

有時候文件過多,一次無法全部打開(vim -p 默認一次最多打開9或10個),可以用set tabpagemax=30改動默認的最大tab頁限制。或者:

:tab ball         show each buffer in a tab (up to 'tabpagemax' tabs)

:tab help         open a new help window in its own tab page

想要grep在代碼文件夾中查找目標片斷,並編輯所有命中的文件? grep -rn 'Utils' . | awk -F: '{print $1}' |sort -u | tr '\n' ' '  對於結果,運行vim -p就能夠

vim查看一個正在被其它進程改動的文件時需要reload文件,:e

vi中運行shell命令 :!your_cmd  這樣可以用:!ls :!gcc 等等 很是方便

在普通模式下,可以使用 yaw  命令複製當前光標所在單詞,用daw刪除光標所在單詞

bash下用!your_cmd_header可以調用上一個以這個開頭的命令,比方你簽名用了yum search xx,現在!yum就可以調用這個命令

和上面相似的命令是ctrl+r。輸入命令頭...(mysql命令行也有這個功能,僅僅是mysql在沒找到想要sql而非預期SQL把命令行佔領時不能用ctrl+c取消,應該用ctrl+a,ctrl+k,Linux下命令行通常不是vim兼容的就是emacs兼容的)

ctrl+a  跳到mysql命令行開頭

ctrl+u  從光標位置刪到行首

ctrl+k  從光標位置刪到行末


crtl+v列的virtual模式
v是行的virtual模式
在vi裏面 gd是找定義位置或當前文件第一次出現的位置 可以用於高亮文本(相似於/sss查找)
在vi裏面 shift+k可以直接打開當前函數的man 1頁面


摺疊(http://vim.wikia.com/wiki/Folding)

:set fdm=indent 依照相同的縮進摺疊,極適合Lua。所有function都折起來了(foldmethod。默認foldmethod=manual,即用zf手動摺疊;其它方式是syntaxexpr(本身定義摺疊規則))

zR一次性打開所有摺疊

在Visual模式創建選中代碼塊的摺疊  zf

創建摺疊(對光標所在的大括號的代碼塊創建摺疊)  zfa{

zf + 數字 + 方向鍵,摺疊

展開摺疊  zo

zO     對所在範圍內所有嵌套的摺疊點展開

關閉摺疊  zc

zC     對所在範圍內所有嵌套的摺疊點進行摺疊

視狀況展開或關閉摺疊  za

刪除光標處摺疊  zdr

x        刪除當前光標下的字符
dw       刪除光標以後的單詞剩餘部分(跟按w向前依照單詞移動同樣)

db       刪除光標以前的單詞剩餘部分(跟按b向後依照單詞移動同樣)
d$       刪除光標以後的該行剩餘部分(跟按¥移到行末同樣)

d0       刪除光標以前的該行剩餘部分(跟按0移到行首同樣)
dd       刪除當前行。

v加方向鍵選中內容後,可用d將選中部分刪除

d + num + 方向鍵 向上或向下(箭頭或者jk都行哦)刪除num行(num去除自身之外的行數)

y 複製也有上述用法


vim設置字體顏色

[root@localhost server]# ls /usr/share/vim/vim72/colors/
blue.vim      default.vim  desert.vim   evening.vim  morning.vim  pablo.vim      README.txt  shine.vim  torte.vim
darkblue.vim  delek.vim    elflord.vim  koehler.vim  murphy.vim   peachpuff.vim  ron.vim     slate.vim  zellner.vim
[root@localhost server]# cat ~/.vimrc
:colorscheme desert

在vim已打開的狀態下。用:colorscheme desert也可切換到相應的顏色方案!

對於公用的機器和用戶,不想忍受別人的顏色方案可以在當前鏈接上創建一個別名,這樣就可以本身用本身喜歡的樣式了

alias vim='vim --cmd ":colorscheme desert"'

alias vim='vim --cmd ":colorscheme desert" --cmd ":set number"'

vim --cmd ":colorscheme desert" --cmd ":set number" --cmd ":set tabstop=4 shiftwidth=4 expandtab"


vim設置摺疊的顏色
默認是一個灰白條。有些干擾思惟。可在 $HOME/.vimrc 這樣設置

:highlight Folded term=standout ctermfg=4 ctermbg=0

把vim tab的長度設成4個空格:在.vimrc中增長set tabstop=4

vim中的tab本身主動用四個空格替換:set tabstop=4 shiftwidth=4 expandtab

不要用空格替換tab的命令 :set noexpandtab

vim中空格(2個/4個)跟tab之間切換: :%s/    /\t/g              :%s/\t/    /g

遇到疑難可參考: http://stackoverflow.com/questions/426963/replace-tab-with-spaces-in-vim http://stackoverflow.com/questions/9104706/how-can-i-convert-spaces-to-tabs-in-vim-or-linux

vim中方向鍵移動光標很是慢:

w(word)往前按單詞移動

b(back)日後按單詞移動

0跳至行首(等同於home鍵)

$跳至行末(等同於end鍵)

%跳至相應的符號還有一端。比方從{到},從(到)

'0 回到上次編輯的位置
vim +n urfile // n爲行號。打開後光標定位到指定行
vim + urfile //打開文件後光標定位到最後一行

nl fileName    列出文件內容和行號(後面可以跟多個文件)
   11  ln -sf /home/team/www html 後面的是鏈接文件。前面的是實際文件
  185  passwd xudongsong 改動password(此爲root使用方法) 普通用戶改動本身的password時,僅僅需passwd<enter>
  332  tar zvxf /tmp/ldapman.tar.gz   解壓縮
      tar jvxf ffmpeg-git-01fcbdf.tar.bz2
       tar zvcf xxx.tar.gz xxx/    壓縮 (想高速打包而不壓縮就去掉z)
       /usr/bin/unrar x civ-server.rar  解壓縮rar壓縮文件

       unzip xxx.zip            解壓縮zip壓縮文件

       zip -r xxx.zip a.txt bDir 壓縮文件

更全面的壓縮、解壓縮可參考這位仁兄的博客 http://blog.csdn.net/zzcv_/article/details/2801582
 
  448  netstat -lntp  查看監聽port
mysql -h10.4.4.1 -u root -p --default-character-set=utf8
   562  id    顯示登錄者的信息
    <linux與unix shell編程指南 005.pdf>
    LINUX、BSD的echo需要用-n阻止本身主動換行、用-e提醒bash處理轉義字符\ (用了-e,可以用\c阻止本身主動換行),系統V可以直接用\c阻止本身主動換行
    echo -n "hello"            阻止輸出後本身主動換行
    echo -e "hello\tworld\c"    使得輸出的轉義字符生效
    echo "hello,world" > /tmp/test.log    重定向,覆蓋
    echo "hello,world" >> /tmp/test.log    重定向,追加
    shell腳本前面最好加上#!/bin/bash
         因爲在當前bash下用./tt.sh運行tt.sh腳本固然使用當前bash運行
         假設在python用popen("./tt.sh")運行就不必定了,多是/bin/sh在運行腳本哦。/bisn/sh是dash不是bash。

這種話腳本里面的echo "abc\ndef"對'\n'的處理是同樣的(確定還有其它的差異,僅僅是我栽在這個\n上面了)
    cat file1 file2
    cat file1 file2 > /tmp/allfile
    cat > /tmp/newfile        (ctrl+D結束新文件輸入)
    cat -v file    顯示控制字符(檢查ftp從DOS傳過來的文件)
    dos2unix file    把dos下的那些控制符轉換成linux格式

    paste file1 file2     把兩個文件的各行連在一塊兒做爲新行打印出來
    split -1 file1.txt    文件切割,依照一行一個文件切割
  611  rpm -ql httpd
[dongsong@tm4ctt143 ~]$ who
dongsong pts/0        2011-02-18 10:08 (10.4.6.120)

awk 在 <linux與unix shell編程指南 009.pdf>
awk 有很是多字符串處理函數、數字處理函數、時間函數等,功能強大,用man可以看到。length(), substr(),tolower(),toupper()...
[dongsong@tm4ctt143 ~]$ who | awk '{print $1"\t"$3"\t"$2}'        awk可以控制輸出那個字段(域標記從$1開始,假設用$0則表示所有域,$NF表示最後一個域$(NF-1)表示倒數第二個域)
dongsong        2011-02-18      pts/0

cat /etc/passwd | awk -F: '{print $1}'                    awk -F 是以字符切割
awk '{print $2}' data..f
 awk '{if($1=="265919437") print $1}' active_22_122999_20110209.log
awk '{if($1~/265919437/) print $1}' active_22_122999_20110209.log
awk '{if($1!~/265919437/) print $1}' active_22_122999_20110209.log
cat /tmp/debug_ips.log |sort |awk '{if($1==line){count++;} else{if(count>0) print count;count=1;} line=$1;} END {print count;}'|awk '{if($1>1) print $1}'|wc -l

[dongsong@tm4ctt143 shell_study]$ echo adsfafds|awk '{print substr($0, 1)}'
adsfafds
[dongsong@tm4ctt143 shell_study]$ echo adsfafds|awk '{print substr($0, 1, 2)}'
ad

cat /tmp/t | awk '{t=t"info[\""$2"\"],"} END {print t;}'

[dongsong@localhost kl-robot]$ echo 'entryId,pos,count,remainTime,isBinding,type' | tr ',' '\n' | awk '{t=t"info[\""$0"\"],"} END {print t;}'
info["entryId"],info["pos"],info["count"],info["remainTime"],info["isBinding"],info["type"],

兩種計算字符串長度的方法,注意差異,awk取得的是準確值

[dongsong@tm4ctt143 shell_study]$ echo "sfff"|wc -c
5
[dongsong@tm4ctt143 shell_study]$ echo "sfff"|awk '{print length($0)}'
4
[dongsong@tm4ctt143 shell_study]$ read testStr
a(後面四個空格)
[dongsong@tm4ctt143 shell_study]$ echo $testStr|awk '{print length($0)}'
1
[dongsong@tm4ctt143 shell_study]$ echo $testStr|wc -c

2

grep -i 忽略大寫和小寫
tail -f api.log -n 100 | grep -e statuses__mentions -e eats 依據多個短語過濾
[dongsong@tm4ctt143 ~]$ df | awk '{print $1}'| grep -v "Filesystem"    grep -v  xx 不顯示包括xx的條目
/dev/sda3
/dev/sda1
tmpfs
dongsong@tm4ctt143 ~]$ df | awk '{print $1}'| grep -v "Filesyst" | sed s'/\/dev\///g'        再用管道傳過去給sed處理一下
sda3
sda1
tmpfs

[dongsong@tm4ctt143 ~]$ who | tee who.out                tee,諧音T,輸出到screen的同一時候輸出一個副本到文件裏去

tee -a  #append

dongsong pts/0        2011-02-18 10:08 (10.4.6.120)

tee -a file        -a追加到文件末尾

<linux與unix shell編程指南 005.pdf>
command > filename 把把標準輸出重定向到一個新文件裏
command >> filename 把把標準輸出重定向到一個文件裏(追加)
command 1 > fielname 把把標準輸出重定向到一個文件裏
command > filename 2>&1 把把標準輸出和標準錯誤一塊兒重定向到一個文件裏
command 2 > filename 把把標準錯誤重定向到一個文件裏
command 2 >> filename 把把標準輸出重定向到一個文件裏(追加)
command >> filename 2>&1 把把標準輸出和標準錯誤一塊兒重定向到一個文件裏(追加)
command < filename >filename2 把c o m m a n d命令以f i l e n a m e文件做爲標準輸入,以f i l e n a m e 2文件
做爲標準輸出
command < filename 把c o m m a n d命令以f i l e n a m e文件做爲標準輸入
command << delimiter 把從標準輸入中讀入。直至遇到d e l i m i t e r分界符
command <&m 把把文件描寫敘述符m做爲標準輸入
command >&m 把把標準輸出重定向到文件描寫敘述符m中
command <&- 把關閉標準輸入

> file                建立一個長度爲0的文件

command<<delimiter將分界符delimiter以後直至下一個相同的分界符以前的所有內容都做爲輸入,遇到下一個分界符,shell就知道輸入結束了。


[dongsong@tm4ctt143 ~]$ read var1 << hello
> look
> hello
[dongsong@tm4ctt143 ~]$ echo $var1
look
  777  netstat -a
    ls -l | grep ^d                僅僅顯示文件夾文件
  972  histpry |less
  973  touch hello.php
        <下面可以在 linux與unix shell編程指南 002.pdf 中找到>
       touch -t 05042140 test.txt 建立一個更改時間是5月4號21:90的文件
       find . -newer test.txt    尋找比test.txt更新的文件
       find . -newer !test.txt    與上面相反
       find . -type d    查找當前文件夾下的文件夾
       find . ! -type d | sort 查找當前文件夾下除文件夾之外的文件,後面管道加上sort是排序
       find . -type f -mtime -10 -print -mount -exec wc -l {} \;
       find . -type f -mtime -10 -print -mount |xargs wc -l    與上面等同。僅僅是xargs一批一批的運行,exec把前面所有的當成參數一次運行()
        find . -name "*.cpp" | xargs grep "int"     在文件裏查找int
    ls *.sql | grep -v 2011-11-17 | xargs rm        刪除名字不含2011-11-17字樣的sql文件
ifconfig
netstat -lntp
tcpdump -i lo port 389 -s 1000000 -A
tcpdump -i lo -s 10000 -A -w /home/team/ddd port 389  抓包
tcpdump -i eth0 -s 10000 -A -nnn host 10.0.4.133 and port 80

tcpdump -i eth0 -nnn port 1234

-nnn是顯示數字,便於直接觀看結果

find . -name "*server.conf" | xargs -I {} cp {} /tmp/  對符合條件的文件作copy,-I是作替換,把管道輸出東西替換到後面位置上(man xargs)。

也可以嘗試如下的方式

find dir1 -maxdepth 1 -type f -exec cp -t dir2 {} +


今天(2014.7.17)遇到一個問題是系統有tcpdump但是用yum list看發現不是yum源裏面的。而系統自帶的這個僅僅能打印很簡陋的信息,從yum裝一個就正常了

/usr/sbin/tcpdump -i eth0 -s 1000 -nnn host 10.6.10.140 and port 5630 > /tmp/tcpdump.log  2>&1 & 

 
tcpdump -i eth0 port 1234 -w xxx.txt
-w把抓包的數據寫入文件,可以在win如下用wireshark查看網絡數據

netstat -lntp
stty -a
kill -s
kill -a  
kill -l
  205  gcc -o server Makefile
  206  ./server
  218  cscope -b -R *.cpp
  239  mv ../gamechat ./
  251  stty -a
  252  kill -9 進程號
  280  make deps
  281  make
  290  scripts/ctt_chatserver.sh start
  294  scripts/ctt_chatserver.sh status
  312  ./chat_client -k xdfeWscTsx434KXDscdESxm_wXd 10.4.3.143:8800
 
whereis gnome-terminal

把整個目錄 folderTared 的內容打包成一個gz文件:
tar zvcf folderTared.tar.gz /theDir/folderTared
把壓縮的gz文件恢復到指定文件夾下:
tar zvxf folderTared.tar.gz /theDir/

gunzip t_wiki_doc-2011-10-12.sql.gz

svn checkout ./gamechat http://10.4.3.143/subversion/gamechat/

svnserve --root /data/svn/svn --daemon 把其它倉庫的svn數據文件夾的文件夾直接複製到/data/svn/svn如下。執行啓動後可正常工做!

svn具體配置: http://wiki.ubuntu.org.cn/SubVersion

svn log -v | head -n 10

svn diff -r 4016:4017 connectserver.conf

chmod a+x xx/*


tail -f xxx.txt 動態顯示變化着的文件

[dongsong@tm4ctt143 udplogger]$ md5sum udplogger
23ee4c96305af409d8092e2553ff4357  udplogger

  535  cat /etc/issue                        查詢系統版本號
   file /sbin/init                 查詢系統是32位仍是64位等相關信息
  541  wget http://mirror.centos.org/centos/5/os/SRPMS/glibc-2.5-34.src.rpm     下載
  543  rpm -qp glibc-2.5-34.src.rpm |less
  546  rpm -ivh glibc-2.5-34.src.rpm
  559  rpmbuild -bp SPECS/glibc.spec
  560  yum install -y audit-libs-devel        本身主動下載安裝軟件
  566  find . -name "ldconfig*"            在當前文件夾.尋找文件
       locate ldconfig                          全盤查找文件ldconfig
  568  vi ldconfig.c
       vi另存爲 :w newFileName

  523  php -r 'fc_set("aaa", "OK");'
  524  php -r 'echo fc_get("aaa");'

  519  fg
    <grep見 linux與unix shell編程指南 008.pdf>
  520  grep -d recurse in_pktinfo /usr/include/*
    grep -E '216|219' data..f
    ps aux|grep game|grep -v grep    

  484  cp -ar dbadmin.bak dbadmin
  496  find dbadmin -name "*.php.org" -exec rm {} \;

     nc -u 10.4.3.143 873             向143機器的873port發送UDP數據
    nc -l 2010                監聽當前機器的2010port並顯示鏈接創建起來後受到的數據,需要回複數據可以直接輸入

    top                     查看系統情況(1cpu展開 O進入排序選擇界面-->q依照內存使用排序)

    c 顯示完整command

    O 選擇排序的列(q內存使用排序)

    top看不到所有進程,可以用top -b -d 1 -n 1 | less (-d delay延遲1秒更新,-n抓一次快照)

    pstree -p 顯示系統內所有進程構成的進程樹(除了用ps axo 'ppid,pid,cmd'來找進程的父進程之外還可以從進程樹裏面找)

      To print a process tree:
          ps -ejH
          ps axjf

       To get info about threads:
          ps -eLf
          ps axms

    殭屍進程會佔用一部份內存(保存進程退出信息的結構體)。可以殺掉其父進程以回收資源(固然。這樣幹可能會影響父進程的業務)

cat /proc/sys/kernel/shmmax        查看系統單個共享內存段最大字節數

    cat /proc/sys/kernel/shmmni        查看系統共享內存段最大個數
    cat /proc/sys/kernel/shmall        查看系統中共享內存頁總數
    python                    使用linux的計算功能
    ipcs -lm                查看系統共享內存的參數
    ctrl+z                     轉到後臺執行
    fg                    調到前臺來
    tail -f operate_push.log        動態查看文件
    tail -n 2 eee > test.php        將文件eee的最後2行輸出重定向到test.php
  519  for f in `find lab -name "*.org"`; do echo ${f%.org}; done

  520  for f in `find lab -name "*.org"`; do mv $f ${f%.org}; done

[weibofengyun@localhost tfengyun_calc]$ for i in {1..5} ; do echo $i; done
1
2
3
4
5
[dongsong@tm4ctt143 ~]$ vvv="Hello world"
[dongsong@tm4ctt143 ~]$ echo ${vvv}
Hello world
[dongsong@tm4ctt143 ~]$ echo ${vvv:-xxxxx}
Hello world
[dongsong@tm4ctt143 ~]$ echo ${vvvv:-xxxxx}
xxxxx
[dongsong@tm4ctt143 ~]$ echo $vvvv

[dongsong@tm4ctt143 ~]$ echo ${vvvv}

[dongsong@tm4ctt143 ~]$ echo ${vvvv:=xxxxx}
xxxxx
[dongsong@tm4ctt143 ~]$ echo ${vvvv}
xxxxx
[dongsong@tm4ctt143 ~]$ echo ${vvva:?EEEEEEErrrrrrr}
bash: vvva: EEEEEEErrrrrrr
[dongsong@tm4ctt143 ~]$ echo ${aa:+hello}

[dongsong@tm4ctt143 ~]$ echo $aa

[dongsong@tm4ctt143 ~]$ echo ${va:+hello}

[dongsong@tm4ctt143 ~]$ echo ${vvv:+hello}
hello
[dongsong@tm4ctt143 ~]$ echo $vvv
Hello world
[dongsong@tm4ctt143 ~]$ echo ${vvv:0:4}
Hell
[dongsong@tm4ctt143 ~]$ echo ${vvv:0:2}
He
[dongsong@tm4ctt143 ~]$ echo ${vvv: -3}
rld
[dongsong@tm4ctt143 ~]$ echo ${!v*}
vvv vvvv
[dongsong@tm4ctt143 ~]$ echo ${#vvv}
11
[dongsong@tm4ctt143 ~]$ echo $vvv
Hello world
[dongsong@tm4ctt143 ~]$ vvv="a.b.php.org"
[dongsong@tm4ctt143 ~]$ vvv="/home/yy/a.b.php.org"
[dongsong@tm4ctt143 ~]$ echo ${vvv%.org}
/home/yy/a.b.php
[dongsong@tm4ctt143 ~]$ echo $vvv
/home/yy/a.b.php.org
[dongsong@tm4ctt143 ~]$ vvv="/home/yy/a.b.org.php.org"
[dongsong@tm4ctt143 ~]$ echo $vvv
/home/yy/a.b.org.php.org
[dongsong@tm4ctt143 ~]$ echo ${vvv%%.org*}
/home/yy/a.b
[dongsong@tm4ctt143 ~]$ echo ${vvv%%.org}
/home/yy/a.b.org.php
[dongsong@tm4ctt143 ~]$ echo ${vvv%%.org*}
/home/yy/a.b
[dongsong@tm4ctt143 ~]$ echo ${vvv%.org*}
/home/yy/a.b.org.php
[dongsong@tm4ctt143 ~]$ man bash

curl http://www.baidu.com 對指定url發出請求,可以-d用post方式、-G用get方式。用於測試比較方便,省去打開瀏覽器的麻煩

siege -f myurls.txt -t 60S [-r 100000] -d 3 -i -c 128 (128 users;3 delay )測試http性能(作壓力測試時-d可指爲零。內網測試機212的apache用siege和ab測試結果差點兒相同,每秒處理2W+請求)

ab -n 10000 -c 10 http://192.168.1.212:8088/ apache提供的http測試工具

ab -v 顯示參數及說明

sar -n DEV 2 5 網卡流量實時監控,2s一次。總共打印五次

sar -n DEV 顯示當天的網卡流量數據(這些還未寫盤到/var/log/sa/sar[day]。僅僅能這樣看)


關於sysstat

sysstat = sar + iostat + mpstat + pidstat + sadf (http://www.blackmoreops.com/2014/06/18/sysstat-sar-examples-usage/)

man sar 可以看到日誌中各項指標和衡量單位的含義

設置打日誌的間隔: vim /etc/cron.d/sysstat

設置日誌保留的時間: vim /etc/sysconf/sysstat HISTORY

從新啓動sysstat: service sysstat restart 或者 /etc/init.d/sysstat restart


ls -lhrt /var/log/sa/  查看sysstat的日誌
sar -f /var/log/sa/sa13
sar -f /var/log/sa/sa13  |less

  675  sar -o data.bin 1      記錄cpu等信息
  676  sar -o data2.bin 1
  677  ls
  678  sar -f data.bin      顯示cpu等信息
  679  sar -f data.bin  -A | less
    stat filename         顯示文件的設備號和inode
       uname -a        查看系統版本號的幾種方法
       cat /proc/version
       cat /etc/issue
       lsb_release     -a
    /sbin/ip     link        查看系統網卡信息的幾種方法
    netstat         -i
     /sbin/ifconfig
      ls -l /proc/進程ID/fd        查看進程打開的讀寫的文件
  554 GLIB_CFLAGS="-I/usr/local/include" GLIB_LIBS="-L/usr/local/lib" ./configure  
  556  export CFLAGS="-I/usr/local/include"
  557  export LDFLAGS="-L/usr/local/lib"
  559  export GLIB_CFLAGS="-I/usr/local/include"
  560  export GLIB_LIBS="-L/usr/local/lib"
  569  make clean
  570  ./configure --help | less
  571  export CPPFLAGS="-I/usr/local/include"
  573  export LDFLAGS="-L/usr/local/lib"
574  export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/     環境變量設置
577  man pkg-config
$pkg-config --modversion gtk+    (查看1.2.x版本號)

$pkg-config --modversion gtk+-2.0 (查看 2.x 版本號)

$pkg-config --version (查看pkg-config的版本號)

$pkg-config --list-all |grep gtk (查看是否安裝了gtk)

env     顯示所有環境變量

grep -rn 'class EkigaMainWindow' ./*
grep -d recurse TopDocs * 遞歸查找
pstree |grep bash
 582  vi test.c
  583  ls
  584  man gcc
  585  ls
  586  gcc -E test.c              預處理 處理頭文件、宏
  587  gcc -E test.c | less
  588  gcc -S test.c             編譯  生成彙編代碼
  589  ls
  590  less test.s
  591  gcc -c test.c             彙編  生成目標代碼
  592  ls test.o
  593  gcc -o test test.o        連接 生成可運行文件
  594  ls
  595  ./ test
  596  ./test
  597  nm test                
  598  nm test | less
  599  ldd test                列出該可運行文件載入的動態庫
  600  export LD_PRELOAD=yes
  601  ./test
  602  man ld
  603  unset LD_PRELOAD
  604  ls
  605  strace test            列出動態庫
  606  sudo yum install strace
  607  ls
  608  strace test
  609  readelf -h test            列出可運行文件(elf文件)的詳細信息
  610  file test
  611  man readelf
  612  readelf -l test
  613  readelf -S test
  614  objdump -d test
  615  which objdump
  616  rpm -qf /usr/bin/objdump
  617  rpm -ql binutils
  618  rpm -ql binutils | | less
  619  rpm -ql binutils | less
  620  man strip
  621  man ranlib

給磁盤分區可以用fdisk -u /dev/sdb 依據提示往下走

cat /proc/partitions查看眼下機器中的所有磁盤及分區狀況

<如下的內容在 linux與unix shell編程指南 003.pdf>
後臺執行領命:crontab at & nohup (前兩個是定時執行腳本)

umask是從權限中「拿走」對應的位(詳細見 linux與unix shell編程指南 001.pdf)
(系統不一樣意你在建立一個文本文件時就賦予它運行權限,必須在建立後用chmod命令添加這一權限)
shutdown -h now 關機
halt -p         關機
[dongsong@localhost soft]$ du -sh       查看文件夾大小
3.5G    .
[dongsong@localhost soft]$ df -Th                查看掛載點
文件系統      類型    容量  已用 可用 已用% 掛載點
/dev/mapper/VolGroup00-LogVol00
              ext3    6.7G  4.6G  1.8G  73% /
/dev/hda1     ext3     99M   12M   83M  13% /boot
tmpfs        tmpfs    252M     0  252M   0% /dev/shm
/dev/hdd5     ext3     14G  4.0G  9.2G  30% /home

[dongsong@localhost soft]$ sudo fdisk -l            查看磁盤空間
Password:

Disk /dev/hda: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1          13      104391   83  Linux
/dev/hda2              14        1044     8281507+  8e  Linux LVM

從新啓動後本身主動掛載:vi /etc/fstab
  加入:/dev/sdb1 /mnt/d ext3 default 0 0

 gcc -L/usr/local/lib test_sqlite.c  -lsqlite3

for i in `find ./ -name "*.[ch]" -exec wc -l {} \;|cut -d ' ' -f1;`; do sum=$(($sum+$i));done  統計文件夾下.c .h文件行數(代碼行數)

或者 find ./ |egrep "*.[ch]$|*.cpp$|*.hpp$" |xargs wc -l

find pathname -options [-print -exec -ok] (詳細見 linux與unix shell編程指南 002.pdf)
find . -perm -007 數字前面有-時,僅僅依據非零項進行篩選
find . -perm  667 數字前面沒有-時,嚴格依照權限篩選
cut -f1,2,3
cut -f2,3,4  chat-20110122.log | grep '^100075'
ls -l proc/2345/cwd                查看進程2345執行的文件夾
cat cityBuild-20110118.log | grep ^5 輸出以5開頭的數據
xudongsong@sysdev:~$ ls | egrep "pub$|^test|2000"    正則匹配
id_rsa.pub
test.cpp
test.log
test.txt
top_3001-3500_1501-2000

-----------cp start--------------
copy 本地的檔案到遠程的機器上
scp /etc/lilo.conf k@net67.ee.oit.edu.tw:/home/k
會將本地的 /etc/lilo.conf 這個檔案 copy 到 net67.ee.oit.edu.tw,使用者 k 的家文件夾下。
copy遠程機器上的檔案到本地來
scp k@net67.ee.oit.edu.tw:/etc/lilo.conf /etc
會將 net67.ee.oitdu.tw 中 /etc/lilo.conf 檔案 copy 到本地的 /etc 文件夾下。
保持歷來源 host 檔案的屬性
scp –p k@net67.ee.tw:/etc/lilo.conf /etc

假設想使用特定port 使用 scp –P(大寫) 如 scp –P 1234 k@net67.ee.tw:/etc/lilo.conf /etc


在此必須注意使用者的權限是否可讀取遠程上的檔案,若想知道不少其它關於 scp 的用法,可去看看 scp 的使用手冊。


ssh-keygen
產生公開鑰 (pulib key) 和私人鑰 (private key),以保障 ssh 聯機的安性, 當 ssh 連 shd server。會交換公開鑰上,系統會檢查 /etc/ssh_know_hosts 內儲存的 key,假設找到client就用這個 key 產生一個隨機產生的session key 傳給server。兩端都用這個 key 來繼續完畢 ssh 剩下來的階段。



它會產生 identity.pub、identity 兩個檔案,私人鑰存放於identity。公開鑰 存放於 identity.pub 中,接下來使用 scp 將 identity.pub copy 到遠程機器的家文件夾下.ssh下的authorized_keys。 .ssh/authorized_keys(這個 authorized_keys 檔案至關於協議的 rhosts 檔案)。以後使用者能夠不用password去登入。RSA的認證絕對是比 rhosts 認證更來的安全可靠。想讓多臺機器都不輸password直接往A上拷數據,能夠把這幾臺機器的identity.pub追加到A得authorized_keys文件後面。
運行:
scp identity.pub k@linux1.ee.oit.edu.tw:.ssh/authorized_keys

若在使用 ssh-keygen 產生鑰匙對時沒有輸入password,則如上所看到的不需輸入password就能夠從 net67.ee.oit.edu.tw 去登入 linux1.ee.oit.edu.tw。在此,這裏輸入的password可以跟賬號的password不一樣,也可以不輸入password。
-----------scp end----------------
ssh -p 7710 root@220.181.83.115 -v  ssh登陸
nohup ********* &     轉後臺執行

date +%s 在bash上輸出unixtime
date --date "1 days ago" 獲取一天前的時間
date +%G-%m-%d   輸出2011-11-17
date +R 查看server時區設置

show global variables like '%time_zone%' 查看mysql時區設置
 select current_timestamp;   查看mysql當前的時間戳

編碼問題:
iconv -f GB2312 -t UTF-8 NationLogInterface.h > NationLonInterface.h_utf-8 bash上對文件進行編碼轉換
在Vim中可以直接查看文件編碼 :set fileencoding 就能夠顯示文件編碼格式

autoreconf -fi
./configure --prefix=/home/myciv/civ-server/trunk/run

linux編譯問題,因爲系統時間致使編譯不正常:find .|xargs touch

加入sudo權限 vi /etc/sudoers

設置sudo不輸入password:sudo visudo 或者 sudo vi /etc/sudoers, 按例如如下改動
%admin ALL=(ALL)NOPASSWD:NOPASSWD ALL  //admin組的用戶sudo所有命令都不用輸入password
%guy ALL=NOPASSWD:ALL //用戶guy sudo 所有命令都不用輸入password
%guy ALL=NOPASSWD:/usr/bin/tt.sh,/usr/sbin/adduser //用戶guy sudo指令命令不用輸入password


fg、bg、jobs、&、ctrl + z都是跟系統任務有關的,儘管現在基本上不怎麼需要用到這些命令,但學會了也是很是有用的
一。& 最經常被用到
   這個用在一個命令的最後。可以把這個命令放到後臺運行
二。ctrl + z
     可以將一個正在前臺運行的命令放到後臺。並且暫停
三。jobs
     查看當前有多少在後臺執行的命令
四。fg
     將後臺中的命令調至前臺繼續執行
   假設後臺中有多個命令,可以用 fg %jobnumber將選中的命令調出,%jobnumber是經過jobs命令查到的後臺正在運行的命令的序號(不是pid)
五。bg
     將一個在後臺暫停的命令,變成繼續運行
   假設後臺中有多個命令,可以用bg %jobnumber將選中的命令調出,%jobnumber是經過jobs命令查到的後臺正在運行的命令的序號(不是pid)  

gdb調試core文件:
 gdb -core core.*** XXX(可運行文件)
 gdb>> bt
 gdb>> f XX(第幾個棧)
 gdb>> list filename:lineNumber
 gdb>> info threads 列出線程
 gdb>> thread n 跳轉到線程
 
源碼之間創建跳轉連接
    ctags -R
    cscope -b -R *.cpp *.hpp
    

    ctags創建以後可以用ctrl+] 和ctrl+t進行正反向跳轉,在bash如下之間用vi -t name可以打開函數或者變量定義的文件(功能真風騷,貌似我僅僅用了ctags的1%)

     vim xxx.c以前要把當前路徑切換到ctags所在文件夾去,不然找不到符號

    ctags的使用方法:http://oreilly.com/catalog/vi6/chapter/ch08.html#ch08_05.htm

    ctags的官網:http://ctags.sourceforge.net/

    對lua創建ctag: ctags --langdef=MYLUA --langmap=MYLUA:.lua --regex-MYLUA="/^.*\s*function\s*(\w+):(\w+).*$/\2/f/" --regex-MYLUA="/^\s*(\w+)\s*=\s*[0-9]+.*$/\1/e/" --regex-MYLUA="/^.*\s*function\s*(\w+)\.(\w+).*$/\2/f/" --regex-MYLUA="/^.*\s*function\s*(\w+)\s*\(.*$/\1/f/" --regex-MYLUA="/^\s*(\w+)\s*=\s*\{.*$/\1/e/" --regex-MYLUA="/^\s*module\s+\"(\w+)\".*$/\1/m,module/" --regex-MYLUA="/^\s*module\s+\"[a-zA-Z0-9._]+\.(\w+)\".*$/\1/m,module/" --languages=MYLUA --excmd=pattern --extra=f -R .

    要對文件名稱也建tag的話需要添加參數 --extra=f


這招不錯

find -name '*.[ch]' -exec ctags {} +

 find lualib-src/ service-src/ skynet-src/ -name '*.[ch]' -exec ctags {} +


如下這個不行,儘管ls -R 會把文件夾如下的子文件夾全部遞歸遍歷一遍。不過ctags並不不過對過濾出來的文件建了tag而是對全部的(ctasg -R)

ls -lhrtR ./* | egrep "*\.h$|*\.cpp$" | ctags -R  

應該這樣用:

find lualib-src/ service-src/ skynet-src/ connectserver/ -name "*.*" | egrep '*.c$|*.h$|*.cpp$' | xargs ctags


vim -t functionName 打開tag定義的文件。並定位到該位置

ctrl+]  跳轉到定義的位置

ctrl+t 回到跳轉的位置

ctrl+o 回到光標上次所在的位置

ctrl+i 前進到光標回跳前的位置

ctrl+e 保持光標不動把頁面向上移動

ctrl+y 保持光標不動把頁面向下移動

ctrl+f 向下滾一屏

ctrl+b向上滾一屏

ctrl+d向下滾

ctrl+u向上滾


怎樣讓ctags支持php的語法跳轉:
下面命令可放到~/.bash_profile中
alias phptags='ctags --langmap=php:.engine.inc.module.theme.php  --php-kinds=cdf  --languages=php --extra=f'
下面設置放到 ~/.ctags文件裏
$ cat ~/.ctags
--regex-php=/^[ \t]*[(private|public|static)( \t)]*function[ \t]+([A-Za-z0-9_]+)[ \t]*\(/\1/f, function, functions/
--regex-php=/^[ \t]*[(private|public|static)]+[ \t]+\$([A-Za-z0-9_]+)[ \t]*/\1/p, property, properties/
--regex-php=/^[ \t]*(const)[ \t]+([A-Za-z0-9_]+)[ \t]*/\2/d, const, constants/
使用時。在代碼文件夾中:
$ phptags -R

就可以生成比較可用的tags文件了。


對於有多個tag文件。可以指定要使用的tag(也可以結合alias來用,或者直接放入.vimrc中,或者直接不帶目標文件的啓動vim而後用:命令來設置和跳轉)  :set tags=$SRC/tags

vim --cmd ":set tag=.../tags"

:set tags 顯示當前載入的tag文件

:tags 顯示當前tag stack(tag跳轉歷史),不少其它命令可以用:help tag-commands來查看

:tag xxx 跳到xxx這個tag的位置去

:tag /^xxx 跳到以xxx打頭的tag位置

:ts /^xxx 列出以xxx打頭的tag

:tag /xxx 跳到包括xxx的tag位置

:ts /xxx 列出包括xxx的tag

:ts xxx

:ts[elect][!] [ident]   列出所有跟目標相符的tag

:ta[g] 功能跟ctrl+]相似

:po[p] 功能跟ctrl+t相似


對Python文件建ctags跳轉標記

http://www.held.org.il/blog/2011/02/configuring-ctags-for-python-and-vim/

[root@test-22 kl-robot]# cat ~/.ctags
--python-kinds=-i
root@test-22 kl-robot]# ctags --list-kinds=python
ctags: Warning: Unsupported parameter 'i' for --python-kinds option
c  classes
f  functions
m  class members
[root@test-22 kl-robot]# ctags -R --extra=f .   
ctags: Warning: Unsupported parameter 'i' for --python-kinds option
[root@test-22 kl-robot]# ls -lhrt tags 
-rw-r--r-- 1 root root 162K 06-11 16:05 tags

----------------------查看系統配置-----------------------

系統

# uname -a               # 查看內核/操做系統/CPU信息
# head -n 1 /etc/issue   # 查看操做系統版本號
# cat /proc/cpuinfo      # 查看CPU信息
# hostname               # 查看計算機名
# lspci -tv              # 列出所有PCI設備
# lsusb -tv              # 列出所有USB設備
# lsmod                  # 列出載入的內核模塊
# env                    # 查看環境變量

資源

# free -m                # 查看內存使用量和交換區使用量
# df -h                  # 查看各分區使用狀況
# du -sh <文件夾名>        # 查看指定文件夾的大小
# grep MemTotal /proc/meminfo   # 查看內存總量
# grep MemFree /proc/meminfo    # 查看空暇內存量
# uptime                 # 查看系統執行時間、用戶數、負載

# cat /proc/loadavg      # 查看系統負載

ss -s  查看TCP鏈接數

磁盤和分區

# mount | column -t      # 查看掛接的分區狀態
# fdisk -l               # 查看所有分區
# swapon -s              # 查看所有交換分區
# hdparm -i /dev/hda     # 查看磁盤參數(僅適用於IDE設備)
# dmesg | grep IDE       # 查看啓動時IDE設備檢測情況

網絡

# ifconfig               # 查看所有網絡接口的屬性
# iptables -nL            # 查看防火牆設置(不加n的話看不到port )
# route -n               # 查看路由表
# netstat -lntp          # 查看所有監聽port

# netstat -antp          # 查看所有已經創建的鏈接

netstat -A inet -n -p   #-A協議(inet:raw tcp udp) -n顯示數字port -p顯示程序名

# netstat -s             # 查看網絡統計信息

netstat -a  | grep 5630  查看跟5630port相關的所有鏈接(已創建的鏈接以及正在監聽的port信息)


進程

# ps -ef                 # 查看所有進程
# top                    # 實時顯示進程狀態

查看進程是否死循環或者殭屍 R+就是死循環

ps axo "lstart,etime,stat,vsize,rss,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm,cmd" | egrep "server|cross"

rss實際內存(KB)

vsize虛擬內存(虛擬地址空間大小。new出來沒有使用的內存空間都屬於虛擬內存。不佔實際物理內存;這個跟交換分區又不是同一個概念,交換分區是指把實際物理內存交換到磁盤上)(KB)

start_time 程序啓動日期

lstart 啓動的準確時間

etime 已執行時長

pgrep "lz2_mapserver|lz2_baseserver" | xargs kill -USR2 #比ps axo + 過濾更精準一點 不會被進程的命令行參數干擾。

是相似於killall的命令。

用戶
# w                      # 查看活動用戶
# id <username>            # 查看指定用戶信息
# last                   # 查看用戶登陸日誌
# cut -d: -f1 /etc/passwd   # 查看系統所有用戶
# cut -d: -f1 /etc/group    # 查看系統所有組
# crontab -l             # 查看當前用戶的計劃任務

服務

# chkconfig --list       # 列出所有系統服務
# chkconfig --list | grep on    # 列出所有啓動的系統服務

程序

# rpm -qa                # 查看所有安裝的軟件包
------------------end of 查看系統配置-----------------------
------------------source命令--------------------------------
source命令的做用就是用來運行一個腳本,那麼:
source a.sh 同直接運行 ./a.sh 有什麼不一樣呢,比方你在一個腳本里export $KKK=111 ,假設你用./a.sh運行該腳本,運行完成後,你運行 echo $KKK ,發現沒有值,假設你用source來運行 ,而後再echo ,就會發現KKK=111。

因爲調用./a.sh來運行shell是在一個子shell裏運行的。因此運行後。結構並無反應到父shell裏。但是 source不一樣它就是在本shell中運行的。因此可以看到結果
------------------end of source命令-------------------------

使用man時可以指定不一樣的section來瀏覽,各個section意義例如如下:
1 - commands
2 - system calls
3 - library calls
4 - special files
5 - file formats and convertions
6 - games for linux
7 - macro packages and conventions
8 - system management commands
(man 1是shell命令,man 2是系統調用。man 3是庫函數)

windows綁定host的文件:C:\WINDOWS\system32\drivers\etc

linux綁定houst的文件:/etc/hosts

---------------------------------------suid/guis-------------------------------------------------------------start---------------
suid意味着假設A用戶對屬於他本身的shell腳本文件設置了這樣的權限。那麼其它用戶在運行這個腳本的時候就擁有了A用戶的權限。因此。假設 root用戶對某一腳本設置了這一權限的話則其它用戶運行該腳本的時候則擁有了root用戶權限。

同理。guid意味着運行對應腳本的用戶則擁有了該文件所屬用戶組中用戶的權限。


爲何使用suid/guid?
舉個樣例:要對數據庫系統進行備份需要有系統管理權限,那麼我可以寫幾個腳本,並設置了它們的guid,這樣我指定的一些用戶僅僅要運行這些腳本就可以完畢對應的工做,而無須以數據庫管理員的身份登陸,以避免不當心破壞了數據庫server。經過運行這些腳本,他們可以完畢數據庫備份及其它管理任務。但是在這些腳本運行結束以後,他們就又回覆到他們做爲普通用戶的權限。
有至關一些命令也設置了suid和guid。

假設想找出這些命令,可以進入/bin或/sb in文件夾,運行如下的命令:
$ ls -l | grep '^...s'
上面的命令是用來查找suid文件的;
$ ls -l | grep '^...s..s'
上面的命令是用來查找suid和guid的。
怎樣設置suid/guid?
假設但願設置suid。那麼就將對應的權限位以前的那一位設置爲4。假設但願設置guid,那麼就將對應的權限位以前的那一位設置爲2;假設但願二者都置位。那麼將對應的權限位以前的那一位設置爲4+2。
一旦設置了這一位,一個s將出現在x的位置上。記住:在設置suid或guid的同一時候。對應的運行權限位必須要被設置。好比。假設但願設置guid,那麼必須要讓該用戶組具備運行權限。
假設想要對文件login設置suid,它當前所具備的權限爲rwx rw- r-- (741),需要在使用chmod命令時在該權限數字的前面加上一個4。即chmod 4741。這將使該文件的權限變爲rws rw- r--。
$ chmod 4741 login
還可以使用符號方式來設置suid/guid。假設某個文件具備這種權限: rwx r-x r-x。那麼可以這樣設置其suid/guid:
chmod u+s <filename>
chmod u+g <filename>
---------------------------------------suid/guis-------------------------------------------------------------end---------------

---------------------------------------mysql------------------------------------------------------------------start------------------
select * from t_battle_mails where iStartX = 245 AND iStartY = 102 into outfile "/tmp/battlemail.txt";
load data infile "/home/myciv/login_logs/login_22_122999_20110112.log" into table t_test1 fields terminated by "\t";

select count(sActivityCode)  from t_user_info where activate = 1 and sActivityCode != '' and first_time > "2011-01-12 00:00:00" and first_time < "2011-01-12 23:59:59";
SELECT UNIX_TIMESTAMP("20110114000000");
SELECT UNIX_TIMESTAMP("2011-01-14 00:00:00");
SELECT FROM_UNIXTIME(12312689349);

datetime字段設置當前值爲默認值的問題(參考http://wotf23771.iteye.com/blog/721013):
MySQL的datetime設置當前時間爲默認值,由於MySQL眼下字段的默認值不支持函數,因此用create_time datetime default now()的形式設置默認值是不可能的。



取代的方案是使用TIMESTAMP類型取代DATETIME類型。


CURRENT_TIMESTAMP :當我更新這條記錄的時候,這條記錄的這個字段不會改變。
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP :當我更新這條記錄的時候,這條記錄的這個字段將會改變。即時間變爲了更新時候的時間。(注意一個UPDATE設置一個列爲它已經有的值。這將不引發TIMESTAMP列被更新。因爲假設你設置一個列爲它當前的值,MySQL爲了效率而忽略更改。

)假設有多個TIMESTAMP列,僅僅有第一個本身主動更新。

同一個表中上述兩種類型字段不能出現隨意兩個!



mysql> select count(*) from t_raw_img where time < NOW();   
+----------+
| count(*) |
+----------+
|     2452 |
+----------+
1 row in set (0.02 sec)

mysql> select NOW();
+---------------------+
| NOW()               |
+---------------------+
| 2012-05-02 10:35:57 |
+---------------------+
1 row in set (0.00 sec)

mysql> select count(*) from t_raw_img where time > "2012-04-27 00:00:00";
+----------+
| count(*) |
+----------+
|     2452 |
+----------+
1 row in set (0.03 sec)



mysqldump備份:mysqldump -uusername -ppassword -h主機 數據庫 數據表 -w "sql條件" --lock-all-tables > 路徑
mysqldump -h 127.0.0.1 -uroot -proot123 civ_hujiajie t_battle_mails -w "1" --lock-all-tables > /tmp/testdump.txt;

mysqldump還原:mysql -uusername -ppassword -h主機 數據庫 < 路徑
source 文件;

導出
    -t 導數據不導結構

    -d 導結構不導數據

    --replace 用replace into替代insert into

    --where="id>100 order by id limit 0,10"

     -r, --result-file=nameDirect output to a given file. This option should be used on Windows to prevent newline"\n" characters from being converted to"\r\n" carriage return/newline sequences. The result file is created and its previous  contents overwritten, even if an error occurs while generating the dump.

    -c or - complete_insert

     這個選項使得結果sql中攜帶列信息。不加該選項是 replace/insert into table t values(...),加了之後是replace/insert into table t(c1,c2,...) values (...)

  --compact           Give less verbose output (useful for debugging). Disables
                      structure comments and header/footer constructs.  Enables
                      options --skip-add-drop-table --skip-add-locks
                      --skip-comments --skip-disable-keys --skip-set-charset. 很是多時候咱們僅僅想要inser/replace語句。其它都不要,那麼這個參數可以把很是多多餘信息幹掉

    1.導出整個數據庫

  mysqldump -u username -p 數據庫名 > 導出的文件名稱

  mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql

  2.導出一個表

  mysqldump -u username -p 數據庫名 表名> 導出的文件名稱

  mysqldump -u wcnc -p smgp_apps_wcnc users> wcnc_users.sql

  3.導出一個數據庫結構

  mysqldump -u wcnc -p -d --add-drop-table smgp_apps_wcnc >d:wcnc_db.sql

  -d 沒有數據 --add-drop-table 在每個create語句以前添加一個drop table


    4. 導出txt文件
    環境變量 path
    cmd
    mysql -uroot -proot 數據庫 表名 > save path

    mysql -uroot -proot db 表名>e:/a.txt


 導入數據庫 sql ,txt

1.   導入sql格式
    source 命令

  進入mysql數據庫控制檯,

  如mysql -u root -p

  mysql>use 數據庫

  而後使用source命令,後面參數爲腳本文件(如這裏用到的.sql)

  mysql>source d:wcnc_db.sql
2. txt格式
    mysql -uroot -proot db< .txt

    把查詢結果直接導入還有一個表中
    insert into tb2 (單據編號, 物品編號, 物品名稱, 物品數量) select '10001',物品編號 ,物品名稱, 物品數量 from tb1

---------------------------------------mysql------------------------------------------------------------------end------------------
<linux與unix shell編程指南 007.pdf> 元字符(正則表達式)
^ 僅僅匹配行首
$ 僅僅匹配行尾
* 一個單字符後緊跟*,匹配0個或多個此單字符
[] 僅僅匹配[ ]內字符。可以是一個單字符,也可以是字符序列。可以使用-表示[]內字符序列範圍。如用[1-5]取代[12345],[^1-5]匹配1-5之外的字符
\ 僅僅用來屏蔽一個元字符的特殊含義。因爲有時在s h e l l中一些元字符有
特殊含義。\可以使其失去應有意義
. 僅僅匹配隨意單字符
pattern\{n\} 用來匹配前面pattern出現次數。n爲次數
pattern\{n,\} 含義同上,但次數最少爲n
pattern\{n,m\} 含義同上。但pattern出現次數在n與m之間

<linux與unix shell編程指南 012.pdf> tr命令的使用
tr特定控制字符的不一樣表達方式
速記符        含義            八進制方式
\a        Ctrl-G 鈴聲        \007
\b         Ctrl-H 退格符        \010
\f         Ctrl-L 走行換頁        \014
\n         Ctrl-J 新行        \012
\r         Ctrl-M 回車        \015
\t         Ctrl-I tab鍵        \011
\v         Ctrl-X             \030

tr -s "[a-z]" < oops.txt > results.txt        去除連續反覆的字符,比方「ddsssssssssss」=》「ds」
tr -s "[a-z]" < oops.txt            和上面的命令意義等同,僅僅是輸出到準備輸出了
tr -s "[\n]" < oops.txt                去除換行
tr -s "[\012]" < oops.txt            和上面的命令等同
[dongsong@tm4ctt143 ~]$ echo "May Day, May Day, Going Down.." | tr "[a-z]" "[A-Z]"        小寫轉大寫
MAY DAY, MAY DAY, GOING DOWN..
 tr "[A-Z]" "[a-z]" < oops.txt            大小到小寫

使用trap命令
trap命令用於捕獲指定的信號並運行提早定義的命令。
其主要的語法是:
trap 'command' signal
當中signal是要捕獲的信號,command是捕獲到指定的信號以後,所要運行的命令。

可以用kill –l命令看到系統中全部可用的信號名,捕獲信號後所運行的命令可以是不論什麼一條或多條合法的shell語句。也可以是一個函數名。
shell腳本在運行時,會產生三個所謂的「僞信號」,(之因此稱之爲「僞信號」是因爲這三個信號是由shell產生的,而其餘的信號是由操做系統產生的)。經過使用trap命令捕獲這三個「僞信號」並輸出相關信息對調試頗有幫助。

<shift在 linux與unix shell編程指南 20.pdf>
shift命令每運行一次,變量的個數($#)減一,而變量值提早一位,shift number去掉number個參數

特定shell變量<linux與unix shell編程指南 14.pdf> 還有本地變量、環境變量、位置變量的完整介紹
$# 傳遞到腳本的參數個數
$* 以一個單字符串顯示所有向腳本傳遞的參數。

與位置變量不一樣,此選項參數可超過9個
$$ 腳本執行的當前進程ID號
$! 後臺執行的最後一個進程的進程ID號
$@ 與$#一樣。但是使用時加引號。並在引號中返回每個參數,for循環用$@取參數可以一次獲得各個參數(不需要用shift)
$- 顯示shell使用的當前選項,與set命令功能一樣
$? 顯示最後命令的退出狀態。0表示沒有錯誤,其它不論什麼值代表有錯誤。



[dongsong@tm4ctt143 shell_study]$ expr 1 \> 0
1
[dongsong@tm4ctt143 shell_study]$ expr 1 \* 10
10

<linux與unix shell編程指南 017.pdf> 條件測試
test通常有兩種格式,即:
test condition

[ c o n d i t i o n ]
使用方括號時,要注意在條件兩邊加上空格。


表17-1 文件狀態測試
-d 文件夾
-s 文件長度大於0、非空
-f 正規文件
-w 可寫
-L 符號鏈接
-u 文件有suid位設置
-r 可讀
-x 可運行

-a 邏輯與,操做符兩邊均爲真,結果爲真,不然爲假。
-o 邏輯或。操做符兩邊一邊爲真。結果爲真,不然爲假。


! 邏輯否。條件爲假,結果爲真。



[dongsong@tm4ctt143 shell_study]$ ls -lh file1.txt
-rw-rw-r-- 1 dongsong dongsong 123 Feb 25 16:43 file1.txt
[dongsong@tm4ctt143 shell_study]$ test -d file1.txt
[dongsong@tm4ctt143 shell_study]$ echo $?


1
[dongsong@tm4ctt143 shell_study]$ [ -d file1.txt ]
[dongsong@tm4ctt143 shell_study]$ echo $?


1
[dongsong@tm4ctt143 shell_study]$ test -x file1.txt -a -x x_shift.sh
[dongsong@tm4ctt143 shell_study]$ echo $?
1
[dongsong@tm4ctt143 shell_study]$ test -f file1.txt -a -x x_shift.sh
[dongsong@tm4ctt143 shell_study]$ echo $?
0
[dongsong@tm4ctt143 shell_study]$ [ -f file1.txt -a -x x_shift.sh ]
[dongsong@tm4ctt143 shell_study]$ echo $?
0

測試字符串
= 兩個字符串相等。
!= 兩個字符串不等。
-z 空串。
-n 非空串。



[dongsong@tm4ctt143 shell_study]$ test "hello" = hello
[dongsong@tm4ctt143 shell_study]$ echo $?
0
[dongsong@tm4ctt143 shell_study]$ test "hello " = "hello"
[dongsong@tm4ctt143 shell_study]$ echo $?
1
[dongsong@tm4ctt143 shell_study]$ test "hello " != "hello"
[dongsong@tm4ctt143 shell_study]$
[dongsong@tm4ctt143 shell_study]$ echo $?
0
[dongsong@tm4ctt143 shell_study]$ test -z ""
[dongsong@tm4ctt143 shell_study]$ echo $?
0
[dongsong@tm4ctt143 shell_study]$ test -z " "
[dongsong@tm4ctt143 shell_study]$ echo $?


1
[dongsong@tm4ctt143 shell_study]$ test -n " "
[dongsong@tm4ctt143 shell_study]$ echo $?
0

測試數值
-eq 數值相等。
-ne 數值不相等。
-gt 第一個數大於第二個數。
-lt 第一個數小於第二個數。


-le 第一個數小於等於第二個數。


-ge 第一個數大於等於第二個數。
[dongsong@tm4ctt143 shell_study]$ test 20 -eq 30
[dongsong@tm4ctt143 shell_study]$ echo $?
1
[dongsong@tm4ctt143 shell_study]$ test 30 -eq 30
[dongsong@tm4ctt143 shell_study]$ echo $?
0
[dongsong@tm4ctt143 shell_study]$ [ 20 -eq 30 ]
[dongsong@tm4ctt143 shell_study]$ echo $?


1
[dongsong@tm4ctt143 shell_study]$ [ 20 -ne 30 ]
[dongsong@tm4ctt143 shell_study]$ echo $?
0
[dongsong@tm4ctt143 shell_study]$ [ "20" -le "30" ]
[dongsong@tm4ctt143 shell_study]$ echo $?
0
[dongsong@tm4ctt143 shell_study]$ [ "20" -ge "30" ]
[dongsong@tm4ctt143 shell_study]$ echo $?
1
[dongsong@tm4ctt143 shell_study]$ [ "20" -lt "30" ]
[dongsong@tm4ctt143 shell_study]$ echo $?
0
[dongsong@tm4ctt143 shell_study]$ [ "20" -gt "30" ]
[dongsong@tm4ctt143 shell_study]$ echo $?


1

[dongsong@tm4ctt143 shell_study]$ LOOP=1
[dongsong@tm4ctt143 shell_study]$ echo $LOOP
1
[dongsong@tm4ctt143 shell_study]$ LOOP=`expr $LOOP + 1`
[dongsong@tm4ctt143 shell_study]$ echo $LOOP
2

expr命令通常用於整數值。但也可用於字符串。通常格式爲:
expr argument operator argument
expr也是一個手工命令行計數器。




注意:
    expr 自身有返回值。返回1表示成功
    $? 取命令運行結果時,0表示成功

. CheckItIsADirectory 將shell文件加載到shell中(點-空格-文件名稱),而後可以用set查看加載的函數,用unset可以去掉加載的函數
              也可以用這樣的方式把一個shell腳本載入到還有一個腳本中,相似於C++中的include
              還可以把把配置文件之類的文件裏的變量包括到其它腳本文件裏

dd命令常用於對磁帶或通常的磁帶解壓任務中出現的數據問題提出質疑或轉換。但也可
用於建立定長文件。

如下建立長度爲1兆的文件m y f i l e。
dd if=/dev/zero of=myfile count=512 bs=2048

dd if=file1.txt of=file2.txt conv=lcase        大寫字母換成小寫字母
dd if=file1.txt of=file3.txt conv=ucase        小寫字母換成大寫字母

: ${_ANS:=$_DEFAULT}請教前輩這名話的意思。


假設變量_ANS爲空,將變量_DEFAULT的值賦給它
最前面:是空操做 (至關於nop?


這樣shell就僅僅對命令行處理完畢賦值,其餘啥也不幹,去掉冒號會發現bash把$_ANS當命令進行運行並報錯了


tput <linux與unix shell編程指南 21.pdf>

tput init 使用前初始化

字符串輸出-------->
名字    含義
bel    警鈴
blink    閃爍模式
bold    粗體
civis    隱藏光標
clear    清屏
cnorm    不隱藏光標
cup    移動光標到屏幕位置(x,y)
el    清除到行尾
ell    清除到行首
smso    啓動突出模式
rmso    中止突出模式
smul    開始下劃線模式
rmul    結束下劃線模式
sc    保存當前光標位置
rc    恢復光標到最後保存位置
sgr0    正常屏幕
rev    逆轉視圖
<---------字符串輸出

數字輸出----------->
名字    含義
cols    列數目
ittab    設置寬度
lines    屏幕行數
<---------數字輸出

布爾輸出----------->
名字    含義
chts    光標不可見
hs    具備狀態行
<-----------布爾輸出
echo -e ""\033[?

25l" 關閉光標
echo -e "\033[?25h"

查找子串
cat /tmp/debug.log | perl -e 'while(<>) { if ($_ =~ /hd_uid=(\d+)/) { print "$1\n"; } } '  匹配每行"hd_uid="後面的數字
if [ ... ]
then
    ...
fi

exit num

case $i in
1)
    echo 1111;;
2)
    echo 2222;;
*)
    echo other;;
esac

basename 返回shell腳本名

var=$(n=1;while ((n<=$num));do echo $n;((n++));done)  雙小括號表示算數運算
echo $var

>>1 2

可以把$var拿來作for循環用

整數運算:
[weibofengyun@localhost tfengyun_calc]$ ((a=a+1))
[weibofengyun@localhost tfengyun_calc]$ echo $a
1
[weibofengyun@localhost tfengyun_calc]$ ((a=a+1))
[weibofengyun@localhost tfengyun_calc]$ echo $a
2
[weibofengyun@localhost tfengyun_calc]$ echo $((a=a+1))
3
[weibofengyun@localhost tfengyun_calc]$ a=$((a=a+1))   
[weibofengyun@localhost tfengyun_calc]$ echo $a

4

[weibofengyun@localhost tfengyun_calc]$ a=$((a+1))
[weibofengyun@localhost tfengyun_calc]$ echo $a
5
:s/procat/law/ 替換當前行第一個 procat爲 law;

    :s/procat/law/g 替換當前行所有 procat爲 law;

    :n,$s/procat/law/ 替換第n行開始到最後一行中每一行的第一個procat爲law;

    :n,$s/procat/law/g 替換第n行開始到最後一行中每一行所有 procat爲law,當中n 爲數字。若n爲「.」,則表示從當前行開始到最後一行;

    :.,200 s/^/xxx/g 把當前行到200行開頭都加上xxx

    :%s/procat/law/(等同於 :g/procat/s//law/) 替換每一行的第一個procat爲law。

    :%s/procat/law/g(等同於 :g/procat/s//law/g) 替換每一行中所有procat爲law。 ----->>>>>>>>>>>常用<<<<<<<<<<<<<<<<<<<<<<<---------

    :%s/procat/law/gc(等同於 :g/procat/s//law/gc) 一查詢方式替換每一行中所有procat爲law;

    若替換字符串中需要替換「/」。則不能使用「/」在命令中做切割符,此時可以可以使用「#」做爲分隔符,當命令中出現「#」。則「/」再也不被系統認做分隔符

    :s#procat/#law/# 替換當前行第一個procat/爲 law/

    :%s/fields:get\w*("/fd./g 正則替換 fields:getUIntField(" fields:getStringField(" ----> fd.


     rpm -qpi rabbitmq-server-2.4.1-1.noarch.rpm

  516  yum search python26
  517  yum install python26-devel.x86_64
  518  easy_install-2.6 MySQL-python
  519  yum install myql-devel
  520  yum install mysql-devel
  521  yum install mysql-devel.x86_64
  522  easy_install-2.6 MySQL-python
 1008  rpm -qa | grep mysql
 1009  rpm -qa | grep python
 1010  rpm -ql MySQL-python
[xudongsong@zhuzhan_mg13 code_calculator]$ file filter.dic
filter.dic: UTF-8 Unicode text                              查看編碼

while [ $var -qe 23 ]
while [[ $var -qe 23 ]]
while (($var<23))

diff file1 file2

diff --strip-trailing-cr file1 file2 忽略windows下行末^M和linux下行末的差異

-N  --new-file
              Treat absent files as empty. 不要放過新文件

-r 不要放過子文件夾

查看系統性能、磁盤io等指標的命令:
  489  vmstat -xdm 2
  490  iostat -xdm 2
  491  df -h
  492  top
  493  vmstat 2
  494  top


  495  dstat
mysql -h172.16.1.217 -usimilar -pqwer1234 similaranalysis
mysql -h172.16.1.217 -usimilar -pqwer1234 similaranalysis < result_sql_file > /dev/null    至關於在mysql命令行下運行source命令

load data infile '/tmp/result_file_00' replace into table t_results_00 fields terminated by ',' (iArticleID1,iArticleID2,iSimilar);

echo "load data infile '/tmp/result_file_$index_hex' replace into table t_results_$index_hex fields terminated by ',' (iArticleID1,iArticleID2,iSimilar);" | mysql -h172.16.1.217 -usimilar -pqwer1234 similaranalysis    至關於在mysql命令行下運行load命令

也可以用mysql -e 'xxx' (However, if the MySQL client software is installed on the remote machine, you can instead use a client command such asmysql -e "SELECT ..." >file_name to generate the file on the client host.)

MySQL replace into 有三種形式:
1. replace into tbl_name(col_name, ...) values(...)
2. replace into tbl_name(col_name, ...) select ...

3. replace into tbl_name set col_name=value, ...

sync是個很好的工具用來增量備份和把站點作鏡像(mirror).

1. 同步一臺機子中的兩個目錄.
引用
rsync –av /path/to/source /home/nixtutor/rsync/daily
2. 同步一個機子中的目錄到另一臺機子
引用
rsync –av /path/to/source user@nixutor.com:/home/nixtutor/rsync/daily
3. 默認的rsync僅僅會傳輸新的文件和文件增量,但是不會刪除不存在的文件.假設你確實想要刪除已經不存在文件,你需要加上"–delete"參數.
引用
rsync –av –delete /path/to/source user@nixutor.com:/home/nixtutor/rsync/daily
4. 如下這個樣例,咱們僅僅同步.iso文件.
引用
rsync -zrv –include="*.iso" host:/home/nixtutor /home/denny

但是假設遇到ssh不是22port的呢?man了半天,事實上很是easy
rsync -zvrtopg -e ‘ssh -p port

同步報錯

rsync: failed to set permissions on "/data jj/gameserver/startsh/conf/refreshConn.sh": Operation not permitted (1)

解決:Replace -avz with -rltvz. (The -a option is equivalent to -rlptgoD.)


CHANGE MASTER TO MASTER_HOST='172.16.1.217',MASTER_USER='repl',MASTER_PASSWORD='repl',MASTER_LOG_FILE='mysql-bin.000224',MASTER_LOG_POS=669460601;

show create table t_titles \G;

show index from wom_comment_sina; 列出數據表的索引

cat tmp_2 | uniq -c   統計各一樣行出現的次數
cat 1.txt |awk '{sum += $1};END

GRANT SELECT, INSERT ON mydb.* TO 'someuser'@'somehost';
grant all privileges on vtdc.* to joe@10.163.225.87 identified by ‘123′;

grant all privileges on vtsimilaranalysis.* to similar@'%' identified by 'qwer1234';

對於需要運行select into outfile 語句的用戶需要授予FILE權限:GRANT FILE ON *.* TO 'XXX'@'%' IDENTIFIED BY 'XXX';

對於需要運行grant語句的用戶需要受權的時候加上with grant option: grant all privileges on *.* to root@'%' identified by '123456' with grant option;

假設rootpassword忘記怎麼辦呢?可以去/etc/my.cnf中增長選項skip-grant-tables,從新啓動mysql,用root登陸進去之後直接改動mysql.user表中的數據(帶skip-grant-tables選項啓動的mysql不能運行grant語句),password要用password('xxxx')加密更新到相應列

revoke all privileges on *.* from mastert@'%'; 取消受權(該用戶仍是可以連上Mysql。僅僅是沒有操做權限,在mysql.user表中仍是可以看到該用戶)

drop user weibofengyun; 刪除用戶(mysq.user表中該用戶信息也會消失)

drop user weibofengyun@'%';

mysql受權後要flush privileges;才幹生效
CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';
sar -n DEV 2  網卡流量
iostat -xkd 3
ALTER TABLE t_results_9c ADD INDEX ( iSimilar );
ALTER TABLE t_results_9c DROP INDEX iSimilar;
mysql -e "kill 172222"

mysqlcheck -c -r dbname tablename

等效於mysql命令行下運行repair table tablename

在大數據量load data時候爲加高速度可以先把key屏蔽掉,入庫完畢後再開啓key:
方案1:
    a.   Execute a FLUSH TABLES statement or a mysqladmin flush-tables command.

    b.    Use myisamchk --keys-used=0 -rq /path/to/db/tbl_name to remove all use of indexes for the table.

    c.    Insert data into the table with LOAD DATA INFILE. This does not update any indexes and therefore is very fast.

    d.    If you intend only to read from the table in the future, use myisampack to compress it. See Section 13.5.3.3, 「Compressed Table Characteristics」.

    e.   Re-create the indexes with myisamchk -rq /path/to/db/tbl_name. This creates the index tree in memory before writing it to disk, which is much faster that updating the index during LOAD DATA INFILE because it avoids lots of disk seeks. The resulting index tree is also perfectly balanced.

    f.    Execute a FLUSH TABLES statement or a mysqladmin flush-tables command.
方案2:
    ALTER TABLE tbl_name DISABLE KEYS;
    ALTER TABLE tbl_name ENABLE KEYS;


crontab
分鐘(0-59) 小時(0-23) 日(1-31) 月(1-12) 星期(1-7) 命令

awk字符串處理:
gsub(r,s)     在整個$0中用s替代r
gsub(r,s,t)     在整個t中用s替代r
index(s,t)     返回s中字符串t的第一位置
length(s)     返回s長度
match(s,r)     測試s是否包括匹配r的字符串
split(s,a,fs)     在fs上將s分紅序列a
sprint(fmt,exp)     返回經fmt格式化後的exp
sub(r,s)     用$0中最左邊最長的子串取代s
substr(s,p)     返回字符串s中從p開始的後綴部分
substr(s,p,n)     返回字符串s中從p開始長度爲n的後綴部分

cat tuiguang.urlip.data.12 | awk '{url=substr($2,0,index($2,"hf=")-2); if (url!=last){print $0;} last=url;}'
 cat tuiguang.urluid.data.12 | awk '{url=substr($2,0,index($2,"hf=")-2); if (url!=last){print $1,count"-"$2,$3,$4,$5;count++;} last=url;}'>urluid.12
 cat result.txt | awk -F'\t' '{docId=$2; $1=""; $2=""; print docId,":",$0}' > new_result.txt

mysql命令行下使用load data命令時加上LOCAL選項會從命令行的client機器尋找數據文件,不加LOCAL選項會從server端尋找文件。

source命令是mysqlclient的功能,不是sql語句,因此source處理的sql文件僅僅能是client機器上的文件

source後接的文件路徑不需要用引號


strace -p 23656

 python /usr/lib64/python2.4/site-packages/jcc/__init__.py
 python /usr/lib64/python2.4/site-packages/jcc/__init__.py --jar paoding-analysis.jar --classpath lib/lucene-core-2.2.0.jar --classpath lib/commons-logging.jar --classpath lib/lucene-analyzers-2.2.0.jar --classpath lib/lucene-highlighter-2.2.0.jar --python paoding --build
 sudo python /usr/lib64/python2.4/site-packages/jcc/__init__.py --jar paoding-analysis.jar --classpath lib/lucene-core-2.2.0.jar --classpath lib/commons-logging.jar --classpath lib/lucene-analyzers-2.2.0.jar --classpath lib/lucene-highlighter-2.2.0.jar --python paoding --install
 
 bash如下尋找歷史命令:ctrl+r

 某些輸入狀態下不能刪除時可以用crtl+backspace刪除

show staus; 查看狀態
show status like '%Open_tables%';  打開的數據表數量

 show processlist; 查看mysql正在運行的操做(進程)

show full processlist;

SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST; 與上一行等效,可作過濾等操做(例如如下所看到的)

SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST where USER = 'womht' and command != 'Sleep' order by time asc\G

select * from information_schema.processlist where info is not null\G

sudo mysqladmin processlist 與上述查詢等效

查看Mysql運行的所有SQL語句: http://stackoverflow.com/questions/568564/how-can-i-view-live-mysql-queries

    show processlist看不到很是快就結束的SQL

    慢查詢日誌又僅僅能看到耗時達到閥值的SQL

    要看實時的、所有的SQL就得從general_log_file來看了,SHOW VARIABLES LIKE "general_log%"; SET GLOBAL general_log = 'ON';

show engines; 查詢mysql的引擎

show variables; 查看所有的配置變量

show variables like '%log%'; 查看包括log的配置變量

上述兩個mysql交互模式下的命令跟bash命令行下的例如如下命令等效:

$ mysqladmin variables

mysql打開log_slow_queries記錄慢查詢,用--log-slow-queries[=file_name] --long_query_time=# 啓動mysqld

或者把這些條目加入到my.cnf,而後用/etc/init.d/mysqld啓動服務也是一個效果(貌似新版本號改爲slow_query_log了)

參考: http://dev.mysql.com/doc/refman/5.1/en/slow-query-log.html


 sudo /sbin/tune2fs -l /dev/sda2 | grep inodes  查看剩餘節點數

 rename table t_wiki_doc_text_1w to t_wiki_doc_text;  #數據表的重命名

數據表的複製怎麼搞呢?(create table like可以建立一個一樣結構的表。)

mysql> select * from xds;
+----+------+-----+
| id | a    | b   |
+----+------+-----+
|  1 | good | 100 |
+----+------+-----+
1 row in set (0.01 sec)
mysql> create table xds_2 like xds;
Query OK, 0 rows affected (0.06 sec)
mysql> insert into xds_2 select * from xds;      
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0
mysql> rename table xds_2 to xds_1;
Query OK, 0 rows affected (0.00 sec)

拷貝大文件命令nc,不需要加密因此比scp快
nc -l port > filename  接收方
nc destip port < filename  發送方

導出csv格式文件:
select * from t_wiki_doc_text into outfile '/data/t_wiki_doc_text' fields terminated by ',' optionally enclosed by '"' lines terminated by '\n'; #換行有問題,會破壞csv格式
select iDocID, replace(replace(ifnull(sTitle,''),'\n',' '),'\r',' ') as title, replace(replace(ifnull(sContent,''),'\n',' '),'\r',' ') as content from t_wiki_doc_text limit 0,1000 into outfile '/data/t_wiki_doc_text' fields terminated by ',' escaped by '\\' optionally enclosed by '"' lines terminated by '\n'; #回車和換行都替換成了空格

    nc和tar可以用來高速的在兩臺機器之間傳輸文件和文件夾,比ftp和scp要來得簡單的多。由於nc是一個超輕量的命令,因此通常busybox都會集成它。當一個linux終端,比方linux pda, 經過usblan的方式鏈接到還有一臺linux主機的時候,這種嵌入式終端上通常不會集成ftp server, ssh server這樣比較笨重的服務,這個時候, nc可能成爲惟一的上傳手段。  
      
    比方將機器A上的mytest文件夾上傳到到機器 B(192.168.0.11)上,僅僅需要:  
      
    在機器B上,用nc來監聽一個port。隨便就好,僅僅要不被佔用;並且將收到的數據用tar展開。

-l表明監聽模式。  
    #nc -l 4444 |tar -C /target/dir -xf -  
      
    而後,在A上經過nc和 tar發送mytest文件夾。

使用一致的4444的port。  
    #tar -C mytest|nc 192.168.0.11 4444  


g++編譯c++程序時怎樣解決動態庫的問題
拿clucene舉例。cmake、make install以後clucene動態庫在/usr/local/lib/如下(libclucene_core.so),靜態庫在/usr/local/include/如下
編譯g++ -o test test.cpp -L/usr/local/lib -lclucene_core  (把so文件的前綴lib和後綴名去掉而後用-l鏈接上)
執行前把動態庫的位置設置到環境變量中,export LD_LIBRARY_PATH=/usr/local/lib, 而後./test就能夠
g++ -DTEST   增長預編譯宏TEST

g++ -g         增長調試信息。可用gdb調試


怎樣避免每次都export LD_LIBRARY_PATH:

[root@localhost tutorial]# cat /etc/ld.so.conf.d/boost_python.conf
/usr/local/boost/lib/
[root@localhost tutorial]# sudo ldconfig


vim /etc/rc.local  開機啓動
chkconfig --list 查看開機啓動的項目。相應/etc/init.d如下的程序
/etc/rc0.d .. /etc/rc6.d 相應的是六個執行級別(runlevel)要啓動的程序


samba文件共享
apt-get install samba (在ubuntu上作的共享)
vi /etc/samba/smb.conf
smbapasswd -a username
從其它機器訪問: \\ip\username\

vi ~/.bashrc , add :
alias sss='ssh -p 50718'
alias sss217='ssh -p 50718 172.16.1.217'


ubuntu下安裝軟件 apt-get install xxx
ubuntu下查詢已安裝軟件 aptitude search xxx
ubuntu下查詢倉庫裏的軟件 apt-cache search xxx

在ubuntu下用ctrl+alt+[f1..f6]可以打開各個tty終端。用ctrl+alt+f7是圖形界面終端,用putty等鏈接上去的是pts終端(模擬終端,不是真正的終端)

if [ $# -lt 8 ]
then
    echo -e "\nUsage:./create_csv.sh host port user passwd db csv_file_dir docs_per_dir docs_per_file\n"
    exit 1
fi

db_host=$1
db_port=$2
db_user=$3
db_passwd=$4
db_name=$5
csv_file_dir=$6
docs_per_dir=$7
docs_per_file=$8

verf=`expr $docs_per_dir % $docs_per_file`
if [ $verf -ne 0 ]
then
    echo "$docs_per_dir%$docs_per_file != 0 "
    exit 1
fi

filename="/tmp/t_wiki_doc_text"
if [ -f $filename -o -d $filename ]
then
    echo "'$filename' exists alreadly. rm it first."
    exit 1
fi

starttime=`date`
echo "started at $starttime.."

sql="select a.DOC_ID, b.DOC_SCORE as score, replace(replace(ifnull(a.DOC_TITLE,''),'\n',' '),'\r',' ') as title, replace(replace(ifnull(a.DOC_TEXT,''),'\n',' '),'\r',' ') as content from t_wiki_doc_text as a, t_wiki_doc as b where a.DOC_ID = b.DOC_ID and b.DOC_STATE = 1  into outfile '$filename' fields terminated by ',' escaped by '\\\' optionally enclosed by '\"' lines terminated by '\n';"
echo $sql | mysql -h$db_host -P$db_port -u$db_user -p$db_passwd $db_name

endtime=`date`
echo "$endtime dump t_wiki_doc_text to '$filename' done."

if [ -d $csv_file_dir -o -f $csv_file_dir ]
then
    rm -rf $csv_file_dir
fi
mkdir $csv_file_dir

files_per_dir=`expr $docs_per_dir / $docs_per_file`
lineNum=`wc -l $filename |awk '{print $1;}'`
fileNum=`expr ${lineNum} + ${docs_per_file} - 1`
fileNum=`expr ${fileNum} / ${docs_per_file}`
dirNum=`expr ${fileNum} + ${files_per_dir} - 1`
dirNum=`expr ${dirNum} / ${files_per_dir}`

for ((i=1; i<=$fileNum; i++))
do
    dirIndex=`expr $i + $files_per_dir - 1` #1,2,3...
    dirIndex=`expr $dirIndex / $files_per_dir`
    dirNum2=`expr $dirIndex \* $docs_per_dir`
    dirNum1=`expr $dirNum2 - $docs_per_dir + 1`
    dirPath="$csv_file_dir/$dirNum1-$dirNum2"
    if [ ! -d $dirPath ]
    then
        mkdir $dirPath
    fi
    fileNum2=`expr $i \* $docs_per_file`
    fileNum1=`expr $fileNum2 - $docs_per_file + 1`
    sed -n "${fileNum1},${fileNum2}p" $filename > "$dirPath/$fileNum1-$fileNum2"
done

endtime=`date`
echo -e "$endtime cut file to small files '$csv_file_dir' done.\n"


echo " set @seqid:=0;select @seqid:=@seqid+1 as seqid,id from t_test into outfile '/tmp/t_test';" | mysql -hlocalhost -uroot -pqwer1234 test    給select的結果加上行號


---------------------------------------------------------------一個導出csv文件的小腳本,雖小卻耗我很多時間------------------------------------------------------------------
set -e   設置以後,腳本出錯(異常)即中止,不會繼續往下運行(set +e 做用相反)

#!/bin/bash
if [ $# -lt 2 ]
then
    echo -e "\nUsage:/bash/sh $0 input('host,port,user,passwd,db,docs_per_file') output('csv_file_dir')\n"
    exit 1
fi

input=$1
output=$2

db_host=`echo $input | awk -F, '{print $1}'`
db_port=`echo $input | awk -F, '{print $2}'`
db_user=`echo $input | awk -F, '{print $3}'`
db_passwd=`echo $input | awk -F, '{print $4}'`
db_name=`echo $input | awk -F, '{print $5}'`
docs_per_file=`echo $input | awk -F, '{print $6}'`
csv_file_dir=$output

filename="/tmp/t_wiki_doc_text"
if [ -f $filename -o -d $filename ]
then
    echo "'$filename' exists alreadly. rm it first."
    exit 1
fi

starttime=`date`
echo "started at $starttime.."

sql="set @seqid:=0; select @seqid:=@seqid+1 as seqid, a.DOC_ID, b.DOC_SCORE as score, replace(replace(ifnull(a.DOC_TITLE,''),'\n',' '),'\r',' ') as title, replace(replace(ifnull(a.DOC_TEXT,''),'\n',' '),'\r',' ') as content from t_wiki_doc_text as a, t_wiki_doc as b where a.DOC_ID = b.DOC_ID and b.DOC_STATE = 1  into outfile '$filename' fields terminated by ',' escaped by '\\\' optionally enclosed by '\"' lines terminated by '\n';"
echo "$sql" | mysql -h$db_host -P$db_port -u$db_user -p$db_passwd $db_name

endtime=`date`
echo "$endtime dump t_wiki_doc_text to '$filename' done."

if [ -d $csv_file_dir -o -f $csv_file_dir ]
then
    rm -rf $csv_file_dir
fi
mkdir $csv_file_dir

lineNum=`wc -l $filename |awk '{print $1;}'`
fileNum=`expr ${lineNum} + ${docs_per_file} - 1`
fileNum=`expr ${fileNum} / ${docs_per_file}`
for ((i=1; i<=$fileNum; i++))
do
    fileNum2=`expr $i \* $docs_per_file`
    fileNum1=`expr $fileNum2 - $docs_per_file + 1`
    if [ $fileNum2 -gt $lineNum ]
    then
        fileNum2=$lineNum
    fi
    sed -n "${fileNum1},${fileNum2}p" $filename > "$csv_file_dir/$fileNum1-$fileNum2"
done

endtime=`date`
echo -e "$endtime cut file to small files '$csv_file_dir' done.\n"


if [ $# -lt 7 ]
then
    echo -e "\nUsage:./create_csv.sh host port user passwd db csv_file_dir docs_per_file\n"
    exit 1
fi

db_host=$1
db_port=$2
db_user=$3
db_passwd=$4
db_name=$5
csv_file_dir=$6
docs_per_file=$7

filename="/tmp/t_wiki_doc_text"
if [ -f $filename -o -d $filename ]
then
    echo "'$filename' exists alreadly. rm it first."
    exit 1
fi

starttime=`date`
echo "$starttime started.."
if [ -f $filename ]
then
    rm $filename
    echo "remove old file '$filename'"
fi

sql="select a.DOC_ID, b.DOC_SCORE as score, replace(replace(ifnull(a.DOC_TITLE,''),'\n',' '),'\r',' ') as title, replace(replace(ifnull(a.DOC_TEXT,''),'\n',' '),'\r',' ') as content from t_wiki_doc_text as a, t_wiki_doc as b where a.DOC_ID = b.DOC_ID and b.DOC_STATE = 1  into outfile '$filename' fields terminated by ',' escaped by '\\\' optionally enclosed by '\"' lines terminated by '\n';"
echo $sql | mysql -h$db_host -P$db_port -u$db_user -p$db_passwd $db_name

endtime=`date`
echo "$endtime dump t_wiki_doc_text to '$filename' done."

if [ -d $csv_file_dir -o -f $csv_file_dir ]
then
    rm -rf $csv_file_dir
fi
mkdir $csv_file_dir

lineCount=0
file="$csv_file_dir/1-$docs_per_file"
if [ -f $file -o -d $file ]
then
    rm -rf $file
    if [ $?

-ne 0 ]
    then
        echo "rm '$file' failed."
        exit 1
    fi
fi
---------------------------------------------------------------一個導出csv文件的小腳本。雖小卻耗我很多時間------------------------------------------------------------------

dpkg顯示安裝包的頭文件以及庫的路徑

dpkg -L libalberta2-dev

MySQL僅僅在以爲走索引可以篩去85%以上數據的時候。才使用索引,假設達不到這個標準。索引是無心義的。
前綴索引:MySQL可以利用索引的前向部分。但不可以利用後向部分。不支持反向索引。


    好比:SELECT col2 FROM table WHERE col1=1;可以使用索引(col1,col2),但不可以使用(col2,col1).
不等比較的優化:假設索引的前向部分在WHERE中是等於。那麼可以使用索引,假設索引的前向部分再WHERE中是不等比較,那麼不可以爲後面的等於比較使用索引
    好比:SELECT col1 FROM table WHERE col2=1 AND col3 >10;可以全然使用索引(col2,col3),但僅僅可以使用(col3,col2)的前綴,
排序的優化:可以在條件是等於的時候繼續使用索引排序,或者條件中的不等於字段就是排序字段。
    好比:SELECT col1 FROM table WHERE col2=1 AND col3>0 ORDER BY col3,可以全然使用索引(col2,col3)避免排序。但條件是col2<1 AND col3=0 ORDER BY col3時則僅僅能使用col2排除記錄,不可以用來排序。
GROUP BY/DISTINCT也是以排序爲基礎,優化同上。

ubuntu下alt+f2可以執行應用程序,gnome-terminal可以啓動終端

sudo yum install python-setuptools
sudo easy_install virtualenv
virtualenv venv
cd venv/
bin/easy_install django

要安裝的庫有多個版本號時,可以用easy_install PackageName==1.2.3指定版本號號作安裝http://peak.telecommunity.com/DevCenter/EasyInstall#changing-the-active-version

python有多個版本號時候。怎樣用easy_install把包安裝到指定的python版本號中去:/usr/local/bin/python2.6 -m easy_install ThePkgName

~/venv/bin/python manage.py runserver 0.0.0.0:8000
~/venv/bin/easy_install python-memcached
~/venv/bin/python manage.py fetchfollowers --screen_name 嚇人的鳥
~/venv/bin/python manage.py syncdb
~/venv/bin/python manage.py runserver 0.0.0.0:8000

python -m easy_install twisted 用easy_install把twisted庫安裝到指定的Python環境下(which python可以看到這條命令的python是什麼環境下的python)

python程序數據庫入庫報錯

Traceback (most recent call last):
  File "main.py", line 225, in <module>
    (hashlib.md5(imgUrl).hexdigest(), imgUrl, database.MySQLdb.Binary(imgData)))
  File "/home/dongsong/boosencms/src/boosenspider/database.py", line 108, in execute
    affects = cursor.execute(sql, args)
  File "build/bdist.linux-x86_64/egg/MySQLdb/cursors.py", line 174, in execute
  File "build/bdist.linux-x86_64/egg/MySQLdb/connections.py", line 36, in defaulterrorhandler
_mysql_exceptions.OperationalError: (1153, "Got a packet bigger than 'max_allowed_packet' bytes")


解決的方法:設置max_allowed_packet

[root@bogon dongsong]#
[root@bogon dongsong]# vi /etc/my.cnf

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
max_allowed_packet=10485760

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid



不停止服務程序進程直接將日誌文件移走,兩種方法:

 

       1.在程序中提供對信號SIGUS1的處理程序。收到SIGUS1又一次打開輸出文件out.txt

          mv     out.txt     xx/xx      (inode不會改變)

         kill     SIGUS1  進程ID

 

       2.程序是別人寫的,沒有收到信號則又一次打開文件的處理邏輯

          cp     out.txt   xx/xx (inode不會改變)

          echo   -n >out.txt 截斷out.txt,out.txt的inode不會改變。內容被清空


ntpdate time.windows.com && hwclock -w 

ntpdate pool.ntp.org

linux設置時間 date -s

寫入bios神馬的 clock -w

linux時間校準(網絡同步)ntpdate

假設是virtualBox中的linux系統。就算關閉網絡時間同步可能也不行。因爲virtualBox會本身主動依據宿主機器對虛擬系統作時間校訂。這樣的狀況可以改動實體機時間來作測試

cat /proc/partitions 查看分區信息

yum install安裝的包可以用 yum remove刪除

easy_install 安裝的python包可以用easy_install -m 刪除,貌似更好的方式使用pip uninstall pkg_name (http://stackoverflow.com/questions/1231688/how-do-i-remove-packages-installed-with-pythons-easy-install)

$ wget https://bootstrap.pypa.io/get-pip.py
$ python get-pip.py


源代碼編譯的包信息沒法經過工具查詢到和管理,需要自行記住安裝路徑。卸載時也需要手動從安裝文件夾刪除,因此應該儘可能使用yum rpm apt等包管理工具

檢查本地某port是否在監聽

[dongsong@bogon api]$ telnet localhost 9306
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection refused

rpm -ivh http://mirrors.sohu.com/fedora-epel/6/i386/epel-release-6-7.noarch.rpm 從url安裝rpm包

奇妙的sql。神馬意思你懂的

update t_site_bbs set count = (select count(*) from t_raw_data where t_raw_data.site = t_site_bbs.site and t_raw_data.bbs = t_site_bbs.bbs) where (site,bbs) in (select site,bbs from t_raw_data)

Image包的問題

#IOError: decoder jpeg not available  
    #Fix:  
    #First remove your last install!  
    rm -rf /usr/lib/python2.4/site-packages/PIL  
    rm /usr/lib/python2.4/site-packages/PIL.pth  
    rm ~/Imaging-1.1.6  
      
    #Make sure you install at the libraries for both JPEG support and FreeType2:  
    yum install libjpeg  
    yum install libjpeg-devel  
    yum install freetype  
    yum install freetype-devel  
      
    #Get PIL again and do the install:  
    wget http://effbot.org/media/downloads/Imaging-1.1.6.tar.gz  
    tar -zxvf Imaging-1.1.6.tar  
    cd Imaging-1.1.6/  
    python setup.py build_ext -i  
      
    #Run the included test to make sure everything now works:  
    python selftest.py  
      
    #If everything worked do the real install:  
    $ python setup.py install  

create database official_boosencms CHARACTER SET utf8;

用history找到的命令可以用 !命令號 再次運行。相似於 !xxx 運行以xxx開頭的上一條命令

ls -l /proc/8634/task/ 可以看到進程的線程信息

鏈接數決定了MySQL併發處理的能力,查看鏈接數
show variables like "max_connections";
把最大鏈接數更新到600:
set global max_connections = 200;
也可以在配置文件裏改(見mysql調優,僅僅是要從新啓動)

set global general_log = ON; 把常規查詢日誌打開,所有查詢都會記錄到 general_log_file指定的文件裏

查看memcached狀態(參考 http://www.xmsigh.com/node/61)

printf "stats\r\n" | nc 127.0.0.1 11211

stats | stats slabs | slabs items (more is here http://lzone.de/articles/memcached.htm)

要讓mamcached的老數據不被新數據用「近期最少使用」原則擠出去,應該在啓動memcached的時候加上參數-M,詳細可參照memcache -h

要改動memcached的默認啓動參數,可查看/etc/rc.d/init.d/memcached (/etc/rc.d/init.d等同於/etc/init.d,兩者由符號連接關聯在了一塊兒)找到相關配置或配置文件路徑並作改動(默認配置文件是/etc/sysconfig/memcached)

select version(); 顯示mysql版本號

--------------------------------------------------------------------------------------------------------------------------------------------------------------->

 wget http://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.25a.tar.gz/from/http://cdn.mysql.com/
 tar zvxf mysql-5.5.25a.tar.gz
 cd mysql-5.5.25a
 sudo yum install cmake -y
 sudo yum install ncurses ncurses-devel -y
 sudo yum install bison -y
 rm CMakeCache.txt
 cmake -DCMAKE_INSTALL_PREFIX=/home/xudongsong/apps/mysql-5.5.25/ .
 make -j 4 #利用4核CPU提速
 make install
 cd ~/apps/mysql-5.5.25/scripts/
 ./mysql_install_db --help
 sudo ./mysql_install_db --datadir=/home/xudongsong/apps/mysql-5.5.25/data/ --user=mysql --basedir=/home/xudongsong/apps/mysql-5.5.25/ --no-defaults
 cd ../bin/
 ./mysqld --verbose --help | less
 sudo chown -R  mysql:mysql ../data
 sudo ./mysqld --no-defaults -u mysql -P3308 -h/home/xudongsong/apps/mysql-5.5.25/data/

sudo ./mysqld_safe --defaults-file=../my.cnf (相對於上一行的啓動方式,更推薦這樣的)

<---------------------------------------------------------------------------------------------------------------------------------------------------------------源代碼安裝mysql-5.5.25

mkfs -t ext3 /dev/sdc 磁盤格式化

mount -t ext3 /dev/sdc /data/ 掛載

vi /etc/fstab 本身主動掛載

/dev/sdc                /data                   ext3    defaults        0 0

後面兩個數字的含義:第一個表示dump 。一個備份工具。

0就表示從不備份;第2個0表示fsck檢查的順序。0表示不檢查。

[dongsong@bogon python_study]$ mail -s "hello,嚇人的鳥" xudongsong0102@163.com
hello,can you received it ?


EOT

centos安裝中文輸入法

sudo yum install ibus ibus-pinyin -y

系統---首選項---輸入法 啓動ibus輸入法

cat /proc/pid/status 各參數意義(man proc)

Name 應用程序或命令的名字
State 任務的狀態,執行/睡眠/僵死/
SleepAVG 任務的平均等待時間(以nanosecond爲單位)。交互式任務因爲休眠次數多、時間長,它們的 sleep_avg 也會對應地更大一些,因此計算出來的優先級也會對應高一些。


Tgid 線程組號
Pid 任務ID
Ppid 父進程ID
TracerPid 接收跟蹤該進程信息的進程的ID號
Uid Uid euid suid fsuid
Gid Gid egid sgid fsgid
FDSize 文件描寫敘述符的最大個數。file->fds
Groups
VmSize(KB) 任務虛擬地址空間的大小 (total_vm-reserved_vm),當中total_vm爲進程的地址空間的大小,reserved_vm:進程在預留或特殊的內存間的物理頁
VmLck(KB) 任務已經鎖住的物理內存的大小。鎖住的物理內存不能交換到硬盤 (locked_vm)
VmRSS(KB) 應用程序正在使用的物理內存的大小,就是用ps命令的參數rss的值 (rss)
VmData(KB) 程序數據段的大小(所佔虛擬內存的大小),存放初始化了的數據。 (total_vm-shared_vm-stack_vm)
VmStk(KB) 任務在用戶態的棧的大小 (stack_vm)
VmExe(KB) 程序所擁有的可運行虛擬內存的大小。代碼段。不包含任務使用的庫 (end_code-start_code)
VmLib(KB) 被映像到任務的虛擬內存空間的庫的大小 (exec_lib)
VmPTE 該進程的所有頁表的大小,單位:kb
Threads 共享使用該信號描寫敘述符的任務的個數。在POSIX多線程序應用程序中,線程組中的所有線程使用同一個信號描寫敘述符。
SigQ 待處理信號的個數
SigPnd 屏蔽位,存儲了該線程的待處理信號
ShdPnd 屏蔽位。存儲了該線程組的待處理信號
SigBlk 存放被堵塞的信號
SigIgn 存放被忽略的信號
SigCgt 存放被俘獲到的信號
CapInh Inheritable。能被當前進程運行的程序的繼承的能力
CapPrm Permitted。進程可使用的能力。能夠包括CapEff中沒有的能力。這些能力是被進程本身暫時放棄的,CapEff是CapPrm的一個子集。進程放棄沒有必要的能力有利於提升安全性
CapEff Effective。進程的有效能力

要使用終端的rz和sz功能上傳下載文件:sudo yum install lrzsz

配置yum源(yum很差使了...):

--->start

 YumRepo Error: All mirror URLs are not using ftp, http[s] or file.  Eg. $releasever is not a valid release or hasnt been released yet/

wget http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-7.noarch.rpm
sudo rpm -ivh epel-release-6-7.noarch.rpm
yum repolist
sudo yum install yum-priorities -y
在/etc/yum.repos.d/epel.repo的epel部分增長
priority=10
yum check-update

參考:http://www.linuxmail.info/add-epel-centos-6/

<----end

查看本身的出口公網ip

Windows: tracert www.google.com

Linux: wget http://members.3322.org/dyndns/getip

           cat getip                    /*got the ip*/

局域網IP段

A類:10.0.0.0 後三位自由分配
B類:172.16.0.0 至172.31.0.0 後兩位自由分配
C類:192.168.0.0 後兩位自由分配

shell作文件內容替換(下述是一個文件的樣例。多個文件本身用for循環)

sed 's/sinaweibo/weibo/g' ./templates/weibo/maintain/reposts.html > t.html

names=`cat /tmp/rename.txt | awk -F: '{print $1}'`;for name in $names; do sed 's/sinaweibo/weibo/g' $name > tmpfile; cp -f tmpfile $name;done;

2013-01-27成老師分享:

start--->

lsmod
modinfo
lspci
ls /sys
ls /proc
mount
runlevel                #執行級別
telinit 3                #切換執行級別
init 3
dmesg                    #系統開機信息
last                    #登陸、開關機歷史
ls /var/log/message        #內核和一些用戶日誌
ls /etc                    #系統配置
rpm -qf /etc/localtime    #查看一個文件是由哪一個軟件包安裝的
rpm -ql glibc            #查看一個軟件包安裝了哪些文件

ldd                     #查看一個程序連接了哪些動態庫

用nm external.so查看動態庫中的符號


<-----end

查看帶寬使用狀況 nethogs

linux下把文件和文件夾用樹狀結構顯示出來

sudo yum install tree -y

tree -d 把所有文件夾用樹狀結構顯示

tree -a 把所有文件夾和文件用樹狀結構顯示

tree -afsDF

tree -afsDtF

-f 打印每個文件和文件夾的全路徑

-s 打印文件大小

-D 打印文件最後改動時間

-t 依照最後改動時間排序(默認降序。不知道咋按升序排)

-r 依照名字反序排(默認是依照名字的字母升序排)

-F 把文件夾後面加上/。便於區分文件和文件夾

-L 2 僅僅遞歸兩層


刪除linux下文件結尾的^M: :%s/^M$//g  (^M要用ctrl+V,ctrl+m來輸入。不能用鍵盤上的^和M來拼湊) 其它方式參見:http://blog.csdn.net/huganle/article/details/7821199

vim打開文件的時候不顯示^M? 用vim -b xxx

dos2unix file也可以作上述轉換

或者用vim filename, :set ff=unix


 grep -rn '^M' 2 | grep php | grep -v ".svn" | grep -v 二進制 | awk -F: '{print $1}' | uniq | xargs dos2unix

防火牆配置port轉發(/etc/sysconfig/iptables):

-A PREROUTING -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.20.0.xxx:15672
-A POSTROUTING -p tcp -m tcp --dport 15672 -j SNAT --to-source 192.168.1.xxx

PREROUTING 是進來的。 --dport :假設目的port是80port。 DANT:目的port,就轉發到 172.。

。。的15672port

POSTROUTONG是出去的。--dport:假設目的port是15672port, --SNAT:改變源地址。就把源地址變成192.168.1.xxx(因爲172.。。

上面設置了 僅僅有192.168.1.xxx可以訪問這個15672port)
再在211上設置port轉發功能 echo 1 > /proc/sys/net/ipv4/ip_forward 。默認是0。每次從新啓動都要執行這個命令。



防火牆在指定port接受指定IP機器的tcp鏈接

-A INPUT -p tcp --dport 80 -j ACCEPT

-A INPUT -s 192.168.1.211 -p tcp --dport 15672 -j ACCEPT


通過個人試驗(2014.9.12)代表:防火牆把port訪問關閉,在該port已經創建的鏈接沒被馬上掐斷。僅僅是數據再也不繼續轉發了。因此client鏈接應該會在沒收到ping包的狀況下(對咱們遊戲項目而言)被掐斷

[root@localhost skynet]# cat /etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
#-A INPUT -m state --state NEW -m tcp -p tcp --dport 9999 -j ACCEPT #必須加在REJECT(也就是如下那兩行)以前!

不然無效!


-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT


怎樣肯定某個端口是被什麼進程佔用(監聽)的?lsof -i :port

[dongsong@localhost twisted]$ netstat -lntp
(No info could be read for "-p": geteuid()=500 but you should be root.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      -                   
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      -                   
tcp        0      0 0.0.0.0:35698               0.0.0.0:*                   LISTEN      -                   
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      -                   
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      -                   
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      -                   
tcp        0      0 :::111                      :::*                        LISTEN      -                   
tcp        0      0 :::80                       :::*                        LISTEN      -                   
tcp        0      0 :::22                       :::*                        LISTEN      -                   
tcp        0      0 ::1:631                     :::*                        LISTEN      -                   
tcp        0      0 :::40856                    :::*                        LISTEN      -                   
[dongsong@localhost twisted]$ lsof -i :80
[dongsong@localhost twisted]$ sudo lsof -i :80
COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
httpd   2020   root    4u  IPv6  11856      0t0  TCP *:http (LISTEN)
httpd   2080 apache    4u  IPv6  11856      0t0  TCP *:http (LISTEN)
httpd   2081 apache    4u  IPv6  11856      0t0  TCP *:http (LISTEN)
httpd   2082 apache    4u  IPv6  11856      0t0  TCP *:http (LISTEN)
httpd   2083 apache    4u  IPv6  11856      0t0  TCP *:http (LISTEN)
httpd   2084 apache    4u  IPv6  11856      0t0  TCP *:http (LISTEN)
httpd   2085 apache    4u  IPv6  11856      0t0  TCP *:http (LISTEN)
httpd   2086 apache    4u  IPv6  11856      0t0  TCP *:http (LISTEN)
httpd   2087 apache    4u  IPv6  11856      0t0  TCP *:http (LISTEN)

lsof是用來列出已打開文件的

[dongsong@localhost boosencms]$ lsof | grep deleted
vim       2383  dongsong    3u      REG  253,0    12288  59742 /tmp/.tt.swp (deleted)


mutt發送郵件:
echo '哈羅,哈羅。能收到麼?'| mutt -s 'debug: can you see it' xudongsong@boosen.com

數組:
[weibofengyun@localhost tfengyun_calc]$ arr[0]='a'
[weibofengyun@localhost tfengyun_calc]$ arr[1]='b'
[weibofengyun@localhost tfengyun_calc]$ arr[2]='c'
[weibofengyun@localhost tfengyun_calc]$ echo $arr
a
[weibofengyun@localhost tfengyun_calc]$ echo ${arr[0]}
a
[weibofengyun@localhost tfengyun_calc]$ echo ${arr[1]}
b
[weibofengyun@localhost tfengyun_calc]$ echo ${arr[2]}
c
[weibofengyun@localhost tfengyun_calc]$ echo ${arr[*]}
a b c
[weibofengyun@localhost tfengyun_calc]$ arr[10]='cccccc'
[weibofengyun@localhost tfengyun_calc]$ echo ${arr[*]}
a b c cccccc
[weibofengyun@localhost tfengyun_calc]$ echo ${arr[10]}
cccccc

函數:
[weibofengyun@localhost ~]$ func() { if [[ $1 != 0 ]]; then echo Good bye.; exit; fi }                    
[weibofengyun@localhost ~]$ func 0
[weibofengyun@localhost ~]$

drop table if exists tmp_user_followers_ids; 假設表存在就刪除。貌似建立刪除數據庫、建立刪除數據表都有相應語法,詳細參考官方文檔

查看binlog
mysqlbinlog --start-position=205222565 --stop-position=205223589 104-relay-bin.000198

od 格式化輸出文件裏的數據,此命令主要用來查看保存在二進制文件裏的值。

-c 依照字符輸出

cat - getip.1 < 25.sql    #「-」表示標準輸入
cat /dev/fd/0 getip.1 < 25.sql     #「/dev/fd/0」和這個等效,在c程序中也可以用/dev/fd/0做爲標準輸入文件來打開

Unix環境高級編程第三章的習題:
shell從左到右運行命令行,因此
a.out > outfile  2>&1
首先設置標準輸出到outfile,而後運行dups將標準輸出拷貝到描寫敘述符2(標準錯誤)上。其結果是將標準輸出和標準錯誤設置爲一樣的文件,即描寫敘述符1和2指向一樣的文件表項。
而對於命令行。
a.out 2>&1 > outfile
由於首先運行dups,因此描寫敘述符2成爲終端(若是命令是交互運行的),標準輸出重定向到outfile。結果是描寫敘述符1指向outfile的文件表項,描寫敘述符2指向終端的文件表項。

今天(2013.9.18)遇到一個小問題
嚇人的鳥  16:17:09
爲何我用myql -P不管指定3303仍是3318都進到同一個數據庫去了?
成老師  16:19:35
可能用的是socket連進去的,你指定 -h 127.0.0.1 -P 3303 試試看?
嚇人的鳥  16:19:43
還真是....


apache(httpd)虛擬主機配置(多個port提供不一樣服務)
<VirtualHost *:8080>
        DocumentRoot /var/www/html/normal
        <Directory "/var/www/html/normal">
                Order allow,deny
                Allow from all
        </Directory>
</VirtualHost>

<VirtualHost *:80>
        DocumentRoot /data/weibofengyun/workspace-php/tfengyunmgr/2
        ServerName www.tfengyun.com
        ErrorLog logs/www.tfengyun.com-error_log
        CustomLog logs/www.tfengyun.com-access_log common
        <Directory "/data/weibofengyun/workspace-php/tfengyunmgr/2">
                Order allow,deny
                Allow from all
        </Directory>
</VirtualHost>

<VirtualHost *:80>
        DocumentRoot /data/weibofengyun/workspace-php/tfengyun140-migrant/
        ServerName vip2.tfengyun.com
        ErrorLog logs/vip2.tfengyun.com-error_log
        CustomLog logs/vip2.tfengyun.com-access_log common
        <Directory "/data/weibofengyun/workspace-php/tfengyun140-migrant/">
                Order allow,deny
                Allow from all
        </Directory>
</VirtualHost>


同一時候在httpd.conf中增長
Listen 80
Listen 8080

perror error_number 顯示系統錯誤碼的信息
一個複製並改動編碼的小腳本

[dongsong@localhost proj.android]$ cat copy_file.sh
#!/bin/sh
fromDir=/media/sf_cocos2d-x/cocos2d-2.0-x-2.0.3/bomb/Classes/
toDir=/data/android/cocos2d-2.0-x-2.0.3/bomb/Classes/
fromFiles=`ls $fromDir`
for fromFile in $fromFiles
do
        #echo $fromFile
        encoding=`file $fromDir$fromFile | awk '{print $2}'`
        #echo $encoding
        if [[ $encoding -eq "UTF-8"  ]]
        then
                /bin/cp -rf $fromDir$fromFile $toDir$fromFile
                echo copied file $fromDir$fromFile
        else
                iconv -f GB2312 -t UTF-8 $fromDir"$fromFile" > $toDir"$fromFile"
                echo iconved file $fromDir$fromFile
        fi
done
#/bin/cp -rf /media/sf_cocos2d-x/cocos2d-2.0-x-2.0.3/bomb/Classes/* /data/android/cocos2d-2.0-x-2.0.3/bomb/Classes/
/bin/cp -rf /media/sf_cocos2d-x/cocos2d-2.0-x-2.0.3/bomb/Resources/* /data/android/cocos2d-2.0-x-2.0.3/bomb/Resources/

chown dongsong:dongsong /data/android/cocos2d-2.0-x-2.0.3/bomb/Classes/*
chown dongsong:dongsong /data/android/cocos2d-2.0-x-2.0.3/bomb/Resources/*

 xhost +si:localuser:apache 授予apache用戶訪問X的權限
配置在 /etc/X11下的xinitrc.d/localuser.sh裏面
ssh超時問題 http://docs.oseems.com/general/application/ssh/disable-timeout
/etc/ssh/ssh_config
clientServerAliveInterval 100
服務端
ClientAliveInterval 30
TCPKeepAlive yes
ClientAliveCountMax 99999
從新啓動
sudo /etc/init.d/sshd restart

設置sshd開機自啓動:
chkconfig sshd on
或者
ntsysv (圖形界面。好多其它服務都可以在這裏管理)

內網IP: 10.x.x.x 172.16.x.x至172.31.x.x 192.168.x.x

git提交改動的文件:(至於新建的項目,在項目首頁有具體的上傳說明)

[xiarendeniao@localhost aoi]$ git add TowerAoi.h test.cpp
[xiarendeniao@localhost aoi]$ git commit -m "fix bug; modify check consistency"
[master 51f5864] fix bug; modify check consistency
 2 files changed, 15 insertions(+), 9 deletions(-)
[xiarendeniao@localhost aoi]$ git push origin master             
Counting objects: 7, done.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 719 bytes, done.
Total 4 (delta 2), reused 0 (delta 0)
To ssh://git@github.com/xiarendeniao/pomelo-aoi.git
   c7fcad0..51f5864  master -> master


git恢復刪除的文件:git ls-files -d | xargs git checkout --

[dongsong@localhost robot]$ git push origin master 
error: The requested URL returned error: 403 Forbidden while accessing https://github.com/xiarendeniao/robot.git/info/refs
fatal: HTTP request failed
[dongsong@localhost robot]$ cat .git/config 
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "origin"]
        fetch = +refs/heads/*:refs/remotes/origin/*
        url = https://github.com/xiarendeniao/robot.git
[branch "master"]
        remote = origin
        merge = refs/heads/master
----改動 url = ...		
[dongsong@localhost robot]$ cat .git/config  
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "origin"]
        fetch = +refs/heads/*:refs/remotes/origin/*
        url = https://xiarendeniao@github.com/xiarendeniao/robot.git
[branch "master"]
        remote = origin
        merge = refs/heads/master
[dongsong@localhost robot]$ git push origin master 
(gnome-ssh-askpass:3020): Gtk-WARNING **: cannot open display: 
[dongsong@localhost robot]$ unset SSH_ASKPASS
[dongsong@localhost robot]$ git push origin master 
Password: 
Counting objects: 19, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (18/18), done.
Writing objects: 100% (19/19), 8.47 KiB, done.
Total 19 (delta 0), reused 0 (delta 0)
To https://xiarendeniao@github.com/xiarendeniao/robot.git
 * [new branch]      master -> master


[root@localhost server]# cat start.sh

#!/bin/sh
waitserver() {
        while [[ 1 ]]
        do
                if [[ $1 != 0 ]]
                then
                        echo "."| nc 0.0.0.0 $1
                        if [[ $? == 0 ]]
                        then
                                break;
                        else
                                echo "server for port "$1" not listened"
                                sleep 1
                        fi
                fi
        done
}
./dbserver > dbserver.log  2>&1 &
waitserver 6666
./baseserver > baseserver.log  2>&1 &
waitserver 6530
./loginserver > loginserver.log  2>&1 &
waitserver 6430
./connectserver  > connectserver.log  2>&1 &
waitserver 5630
#./mapserver > mapserver.log  2>&1 &

valgrind -v --leak-check=full --log-file=mem-leak-check.log ./mapserver > mapserver.log  2>&1 &

(2014.8.21)新學了一招:yum whatprovides "*drm/drm.h"

編譯或者依照時提示找不到某頭文件。可以用這樣的方式找到頭文件的提供方

yum grouplist
yum groupinstall 「X Window System」
yum groupinstall 「Desktop」
yum groupinstall 「Fonts」

怎樣防止sudo rm -rf xx的悲劇?

[root@test-22 tmp]# cat ~/.bashrc
# .bashrc
nodel()
{
        tmp=`date '+%s'`
        if [ ! -d "/trash/$tmp" ]; then
                mkdir "/trash/$tmp"
        fi
        echo "mv $@ /trash/$tmp"
        mv $@ /trash/$tmp
}
alias rm='nodel'
[root@test-22 tmp]# which rm
alias rm='nodel'

生成core dump file:

ulimit -c unlimited

[dongsong@localhost skynet]$ ulimit -a
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 7805
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

要在字符串輸出中夾雜變量,需要用雙引號,而不是單引號

[myciv@xh-4-1 sh]$ echo "sdsdf${a}"
sdsdf1111111
[myciv@xh-4-1 sh]$ echo "sdsdf$a"  
sdsdf1111111
[myciv@xh-4-1 sh]$ echo 'sdsdf$a'
sdsdf$a

刪除文件名稱亂碼的文件(手工沒法輸入文件名稱)

[dongsong@localhost python_study]$ ls -inum 
358391 drwxrwxr-x   2 dongsong dongsong 4.0K 11月  2 02:13 ??˦
[dongsong@localhost python_study]$ find . -inum 358391 -exec mv {} /tmp/t/ \;
[dongsong@localhost python_study]$ find . -inum 358391 -exec rm -rf {} \;

[root@test-22 server]# cat /bin/grep.sh  
#!/bin/sh
aimstr=$1
dirstr=$2
#echo $aimstr
#echo $dirstr
#echo '++++'
if [[ -z $dirstr ]]; then dirstr='.'; fi
grep -rn "$aimstr" $dirstr | grep -v ".svn" | grep -v './tags' | grep -v ".swp "

#!/bin/sh
username="xudongsong"
password=""
read -p "svn password for $username:" password
svn export --username=$username --password=$password svn://svnip:svnport/svndir/myfile.csv ./myfile.csv
python conv.py 

監控日誌錯誤並報警

[dongsong@localhost server]$ cat sa.sh 
#!/bin/sh
mails[0]="youguess@163.com"

ps axo "pid,lstart,etime,stat,vsize,rss,euid,ruid,tty,tpgid,sess,pgrp,ppid,pcpu,comm,cmd" | egrep "xserver|yserver|zserver | grep -v 'egrep' | awk '{print $1}' | xargs kill -USR2

rfile='mailrecord'
if [ ! -f $rfile ]; then touch $rfile; fi

mfile='mailfile'
if [ ! -f $mfile ]; then touch $mfile; fi
echo -n > $mfile

logfiles=`ls -r *log`
tosend=0
for logfile in $logfiles; do
        lastline=`grep -n "$logfile" $rfile | awk -F: '{print $3}'`
        if [ -z $lastline ]; then lastline=0; fi

        lines=`grep -n 'call stack' $logfile | awk -F: '{print $1}'`
        nextline=0
        haserr=0
        for line in $lines; do
                if (($line>$lastline)); then
                        nextline=$line
                        lend=`expr $line + 10`
                        if (($haserr == 0)); then
                                haserr=1
                                echo "------$logfile-------" >> $mfile
                        fi
                        sed -n "$line,${lend}p" $logfile >> $mfile 
                        tosend=1
                fi
        done

        cat $rfile | grep -v $logfile > "${rfile}.new"
        mv "${rfile}.new" $rfile
        echo "${logfile}:${nextline}" >> $rfile
done

if (($tosend == 1)); then
        for addr in ${mails[*]}; do
                mail -s "wsjj server error" $addr < $mfile
        done
fi
rm $mfile
相關文章
相關標籤/搜索