shell手册--笨鸟杰作

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

09年,鸟人第四年linux环境,用ssh终端连上server,两眼一黑(啥命令也不会).....

每次把成老师在我电脑上操作的命令用history找到记录下来,避免反复问他同样的问题...

后来把工作中用到的新命令、从《shell编程..》学到的使用方法也记录下来...

于是,一个暂时的txt文件变成了如今这个样子(日常命令差点儿都能够搜到)....

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



#! /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进行切换

vi中用标签页编辑 :

:tabe[dit] another_file

向后切换 {num}gt  => gt3gt  4gt 5gt (带数字的是以第一个标签页为基准,而不是当前标签页为基准)

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

向前切换 {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://*.com/questions/426963/replace-tab-with-spaces-in-vimhttp://*.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.****.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://*.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://*.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.****.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

版权声明:本文博客原创文章,博客,未经同意,不得转载。

上一篇:Delphi发布了社区版及Delphi 10.3展望


下一篇:Ubuntu防火墙 UFW 设置