============================================================================================================================
09年,鸟人第四年linux环境,用ssh终端连上server,两眼一黑(啥命令也不会).....
每次把成老师在我电脑上操作的命令用history找到记录下来,避免反复问他同样的问题...
后来把工作中用到的新命令、从《shell编程..》学到的使用方法也记录下来...
于是,一个暂时的txt文件变成了如今这个样子(日常命令差点儿都能够搜到)....
============================================================================================================================#! /bin/sh
Shell脚本中用#表示凝视,相当于C语言的//凝视。
但假设#位于第一行开头,而且是#!(称为Shebang)则例外,它表示该脚本使用后面指定的解释器/bin/sh解释运行。
shell凝视-->
A、方法一
:<
'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一般格式为:
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
在普通模式下,可使用 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 从光标位置删到行末
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手动折叠;其它方式是syntax
、expr(
自己定义折叠规则))
zR一次性打开全部折叠
在Visual模式建立选中代码块的折叠 zf
建立折叠(对光标所在的大括号的代码块建立折叠) zfa{
zf + 数字 + 方向键,折叠
展开折叠 zo
zO 对所在范围内全部嵌套的折叠点展开
关闭折叠 zc
zC 对所在范围内全部嵌套的折叠点进行折叠
删除光标处折叠 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
遇到疑难可參考: 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键)
%跳至相应的符号还有一端。比方从{到},从(到)
vim +n urfile // n为行号。打开后光标定位到指定行
vim + urfile //打开文件后光标定位到最后一行
nl fileName 列出文件内容和行号(后面能够跟多个文件)
11 ln -sf /home/team/www html 后面的是连接文件。前面的是实际文件
185 passwd xudongsong 改动password(此为root使用方法) 普通用户改动自己的password时,仅仅需passwd
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、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 在
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 -c5
[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
tee -a file -a追加到文件末尾
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<
[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
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
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 . -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 [email protected]:/home/k
会将本地的 /etc/lilo.conf 这个档案 copy 到 net67.ee.oit.edu.tw,使用者 k 的家文件夹下。
copy远程机器上的档案到本地来
scp [email protected]:/etc/lilo.conf /etc
会将 net67.ee.oitdu.tw 中 /etc/lilo.conf 档案 copy 到本地的 /etc 文件夹下。
保持从来源 host 档案的属性
scp –p [email protected]:/etc/lilo.conf /etc
假设想使用特定port 使用 scp –P(大写) 如 scp –P 1234 [email protected]:/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 [email protected]:.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 [email protected] -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"
vsize虚拟内存(虚拟地址空间大小。new出来没有使用的内存空间都属于虚拟内存。不占实际物理内存;这个跟交换分区又不是同一个概念,交换分区是指把实际物理内存交换到磁盘上)(KB)
start_time 程序启动日期
lstart 启动的准确时间
etime 已执行时长
pgrep "lz2_mapserver|lz2_baseserver" | xargs kill -USR2 #比ps axo + 过滤更精准一点 不会被进程的命令行參数干扰。
是类似于killall的命令。
# w # 查看活动用户
# id
# 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
chmod u+g
---------------------------------------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------------------
^ 仅仅匹配行首
$ 仅仅匹配行尾
* 一个单字符后紧跟*,匹配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之间
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命令每运行一次,变量的个数($#)减一,而变量值提前一位,shift number去掉number个參数
特定shell变量
$# 传递到脚本的參数个数
$* 以一个单字符串显示全部向脚本传递的參数。
与位置变量不同,此选项參数可超过9个
$$ 脚本执行的当前进程ID号
$! 后台执行的最后一个进程的进程ID号
$@ 与$#同样。可是使用时加引號。并在引號中返回每一个參数,for循环用$@取參数能够一次得到各个參数(不须要用shift)
$- 显示shell使用的当前选项,与set命令功能同样
$? 显示最后命令的退出状态。0表示没有错误,其它不论什么值表明有错误。
[dongsong@tm4ctt143 shell_study]$ expr 1 \> 0
1
[dongsong@tm4ctt143 shell_study]$ expr 1 \* 10
10
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
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 [email protected]:/home/nixtutor/rsync/daily
3. 默认的rsync仅仅会传输新的文件和文件增量,可是不会删除不存在的文件.假设你确实想要删除已经不存在文件,你须要加上"–delete"參数.
引用
rsync –av –delete /path/to/source [email protected]:/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.)
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 [email protected] 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
(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
写入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,吓人的鸟" [email protected]
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' [email protected]
数组:
[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提供不同服务)
DocumentRoot /var/www/html/normal
Order allow,deny
Allow from all
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
Order allow,deny
Allow from all
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
Order allow,deny
Allow from all
同一时候在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://[email protected]/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://[email protected]/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://[email protected]/xiarendeniao/robot.git
* [new branch] master -> master
[root@localhost server]# cat start.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
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]="[email protected]"
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
版权声明:本文博客原创文章,博客,未经同意,不得转载。