shell 杂记一(笨鸟)




查找子串
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 保持光标不动把页面向下移动



-------------------------------------------------------------------------------------------------------------






你可能感兴趣的:(shell,杂记)