查找子串
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循环用
shell注释:
#! /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的作用是再次执行命令行处理,也就是说,对一个命令行,执行两次命令行处理。
eval echo "\$$#" 输出最后一个参数,不用eval的话只能输出$number,还不是$number中存储的数据
paste file1 file2 把两个文件的各行连在一起作为新行打印出来
split -1 file1.txt 文件分割,按照一行一个文件分割
两种计算字符串长度的方法,注意区别,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
<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 <&- 把关闭标准输入
command<<delimiter将分界符delimiter之后直至下一个同样的分界符之前的所有内容都作为输入,遇到下一个分界符,shell就知道输入结束了。
<以下可以在 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文件
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是显示数字,便于直接观看结果
tcpdump -i eth0 port 1234 -w xxx.txt
-w把抓包的数据写入文件,可以在win下面用wireshark查看网络数据
把整个文件夹 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
[dongsong@tm4ctt143 udplogger]$ md5sum udplogger
23ee4c96305af409d8092e2553ff4357 udplogger
cat /etc/issue 查询系统版本
file /sbin/init 查询系统是32位还是64位等相关信息
uname -a 查看系统版本的几种方法
cat /proc/version
cat /etc/issue
lsb_release -a
/sbin/ip link 查看系统网卡信息的几种方法
541 wget http://mirror.centos.org/centos/5/os/SRPMS/glibc-2.5-34.src.rpm 下载
--
nc -u 10.4.3.143 873 向143机器的873端口发送UDP数据
nc -l 2010 监听当前机器的2010端口并显示连接建立起来后受到的数据,需要回复数据可以直接输入
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 查看系统中共享内存页总数
ipcs -lm 查看系统共享内存的参数
----------------------------------------------------
[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 网卡流量监控
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
------------------
cat /proc/partitions查看目前机器中的所有磁盘及分区情况
------------------------
umask是从权限中“拿走”相应的位(具体见 linux与unix shell编程指南 001.pdf)
(系统不允许你在创建一个文本文件时就赋予它执行权限,必须在创建后用chmod命令增加这一权限)
---------------------------
[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]$ 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
-----------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 �Cp [email protected]:/etc/lilo.conf /etc
如果想使用特定端口 使用 scp �CP(大写) 如 scp �CP 1234 [email protected]:/etc/lilo.conf /etc
在此必须注意使用者的权限是否可读取远程上的档案,若想知道更多关于 scp 的使用方法,可去看看 scp 的使用手册。
ssh-keygen
产生公开钥 (pulib key) 和私人钥 (private key),以保障 ssh 联机的安性, 当 ssh 连 shd 服务器,会交换公开钥上,系统会检查 /etc/ssh_know_hosts 内储存的 key,如果找到客户端就用这个 key 产生一个随机产生的session key 传给服务器,两端都用这个 key 来继续完成 ssh 剩下来的阶段。
它会产生 identity.pub、identity 两个档案,私人钥存放于identity,公开钥 存放于 identity.pub 中,接下来使用 scp 将 identity.pub copy 到远程机器的家目录下.ssh下的authorized_keys。 .ssh/authorized_keys(这个 authorized_keys 档案相当于协议的 rhosts 档案),之后使用者能够不用密码去登入。RSA的认证绝对是比 rhosts 认证更来的安全可靠。想让多台机器都不输密码直接往A上拷数据,可以把这几台机器的identity.pub追加到A得authorized_keys文件后面。
执行:
scp identity.pub [email protected]:.ssh/authorized_keys
若在使用 ssh-keygen 产生钥匙对时没有输入密码,则如上所示不需输入密码即可从 net67.ee.oit.edu.tw 去登入 linux1.ee.oit.edu.tw。在此,这里输入的密码可以跟帐号的密码不同,也可以不输入密码。
-----------scp end----------------
ssh -p 7710 [email protected] -v ssh登录
nohup ********* & 转后台运行
-----------------------------
设置sudo不输入密码:sudo visudo 或者 sudo vi /etc/sudoers, 按如下修改
%admin ALL=(ALL)NOPASSWD:NOPASSWD ALL //admin组的用户sudo所有命令都不用输入密码
%guy ALL=NOPASSWD:ALL //用户guy sudo 所有命令都不用输入密码
%guy ALL=NOPASSWD:/usr/bin/tt.sh,/usr/sbin/adduser //用户guy sudo指令命令不用输入密码
--------------------------------------------------
fg、bg、jobs、&、ctrl + z都是跟系统任务有关的,虽然现在基本上不怎么需要用到这些命令,但学会了也是很实用的
一。& 最经常被用到
这个用在一个命令的最后,可以把这个命令放到后台执行
二。ctrl + z
可以将一个正在前台执行的命令放到后台,并且暂停
三。jobs
查看当前有多少在后台运行的命令
四。fg
将后台中的命令调至前台继续运行
如果后台中有多个命令,可以用 fg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)
五。bg
将一个在后台暂停的命令,变成继续执行
如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)
---------------------------
源代码之间建立跳转链接
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 -R .
这招不错
find -name '*.[ch]' -exec ctags {} +
这个不行,虽然ls -R 会把目录下面的子目录全部递归遍历一遍,不过ctags并不仅仅是对过滤出来的文件建了tag而是对所有的(ctasg -R)
ls -lhrtR ./* | egrep "*\.h$|*\.cpp$" | ctags -R
vim -t functionName 打开tag定义的文件,并定位到该位置
ctrl+] 跳转到定义的位置
ctrl+t 回到跳转的位置
ctrl+o 回到光标上次所在的位置
ctrl+i 前进到光标回跳前的位置
ctrl+e 保持光标不动把页面向上移动
ctrl+y 保持光标不动把页面向下移动
-------------------------------------------------------------------------------------------------------------