[整理]Shell常用命令

Shell

Vi常用命令(查看原图

Vi常用命令

Shell基本命令

 

clear 清屏

cd – 后退

cd $MYPATH 进入指定目录(环境变量已设)

ls –l 列出文件

ls –al 列出所有文件,包含隐藏文件

whoami 查看自己用户名

cd mydir 进入目录

cd my* 进入目录

tar cvf ddd.tar abc.* def ghi 压缩文件(可以多个)

tar xvf ddd.tar 解压缩

rm –rf mydir 删除目录,不带确认

grep abc *.pc 文件内容中查找abc

grep –c abc *.txt 查找内容abc,并统计

grep –i abc *.txt 查找内容abc,大小写不敏感

set|grep TL_ABC 在环境变量中过滤TL_ABC

diff abc.txt /usera/def.txt 比较文件

find . –name “abc*” 目录中查找文件

cp –p abc.txt /mydir/abc_d.txt 拷贝

ps –ef|grep UserA 列出某用户的进程

shellABC.sh > abc.log 覆盖输出

shellABC.sh >> abc.log 追加输出

exit 退出

su –userABC 切换用户

last 查看最近登录的用户

Esc+K 重复上次输入的命令(多次k向上翻)

   编辑上次的命令: Esc+i 插入 Esc+x 删除 h 向左 l 向右

ipcs –oq|grep 5000 查看消息队列

make 自动查找目录下的makefile并编译

man sighold 查看该函数定义 man socket

cat abc.txt 查看文件

more abc.txt 分页查看文件

vi abc.txt 编辑文件

netstat –i 查看网卡

netstat –r 查看路由

alias pss=’ps –ef|grep abc’ 设置快捷shellpss,常用在.profile

which pss ,或which cc cc所在的目录

PS1=’$PWD>’;export PS1 显示当前目录,而不是$ (常用在.profile)

set –o vi 常用在Esc显示^K的情况下

cp /dev/null abc.log 清空文件 (大文件常常vi打不开(:%d),直接用此命令)

. .profile 修改$HOME.profile文件后不用重新登陆,用此命令立刻生效

set|grep ABC, 查看环境变量,或用env

who|wc –l 统计在线人数

pwd 查看当前目录

ipcs –oq 查看消息队列是否拥堵

tail –f abc.log 跟踪文件末尾

chmod +x find_me.sh 加执行权限

netstat –an|grep 52 查看包含52的端口网络状态

netstat –an|grep LISTEN 查看侦听端口网络状态

ls –l|grep ‘^d’ 列出目录

ls –l|grep ‘^[^d]’ 列出非目录

grep userABC /etc/services 查看DB2端口等信息

grep userABC /etc/passwd 查看$HOME所在目录

dbx –a 99878 调试attachPID(有关dbx调试命令见其他)

 

Shell进阶命令


 sudo !!                    以 root 的身份执行上一条命令
 ctrl r                       在命令历史中查找
 history                     查看命令历史
 !88                          运行命令历史中的编号为88的命令
  ^old^new               替换前一条命令里的部分字符串并重新执行上一条命令
  du -s * | sort -n -r    当前目录里的文件和文件夹按大小排序排列
  > file.txt                  创建一个空文件,比 touch 短
  top -p pid                监控某个进程的CPU和内存消耗情况,ps aux获得PID,或者 ps -p pid -o %cpu,%mem,cmd
  netstat -tulpn           显示侦听的端口
  netstat -anop           显示侦听的端口和侦听在这个端口号的进程
  tail -f /path/to/file.log sed '/^Finished: SUCCESS$/ q' 当 file.log 里出现 Finished: SUCCESS 时候就退出 tail,这个命令用于实时监控并过滤 log 是否出现了某条记录。
  ssh user@server bash < /path/to/local/script.sh 在远程机器上运行一段脚本。这条命令最大的好处就是不用把脚本拷到远程机器上。
  lsof –i                     实时查看本机网络服务的活动状态。
 

 

脚本例子:(打印环境变量)

env>env.log

while read line

do

 var=’echo $line|awk –F=’{print $1}’’

 value=’echo $line|awk –F=’{print $2}’’

 echo $var “------”$value

done<env.log

rm –f env.log

 

脚本例子:(停止进程, 带一个参数,用法ShellName.sh DEF)

for i in ‘ps –ef|grep ABC|grep $1|awk ‘{print $2}’’

do

echo “delete PID $i”

kill -9 $i

done

 

Vi命令

 

:wq保存退出 :q! 强制退出

Kjhl 上下左右

i 进入插入模式, r 进入替代模式

A 到行尾并Append

a 进入Append输入模式

O 在本行上新增一行

o在本行下新增一行

:%d 删除所有文本

:sh 执行外部shell

:389 跳到389, :1 跳至文件头 shift+g,跳至页尾

:set nu 打印行号

Ctrl+f 向下翻页, Ctrl+b 向上翻页

^ 移动至行首 $ 移动至行末

/ 向下查找,? 向上查找 (继续按则查找下一个)

// 重复上次查找

Esc 退出编辑或插入模式

X 删除后一个,x 删除前一个

:1,%s/abc/def/g 替换abcdef

:1,$s/^M//g (转换控制字符^M, Ctrl+V, Ctrl+M输入)

dd删除一行

J 删除一行带回车

Yy 复制一行, p粘贴

 

ShellSed常用用法

 

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

文件abc

   TL_FMT_CHG_SHM_KEY=7100;export TL_FMT_CHG_SHM_KEY

   TL_MSQ_SHM_KEY=7200;export TL_MSQ_SHM_KEY

   TL_TXN_SRV_SHM_KEY=7300;export TL_TXN_SRV_SHM_KEY

  

需要取出等号前面的:awk -F= '{print $1}' abc

 

需要取出TL_FMT_CHG_SHM_KEY等号后面的7100这个值:(原理是取出等号和分号之间的数据)

    awk -F\; '{print $1}' abc|grep TL_FMT_CHG_SHM_KEY|awk -F= '{print $2}'

 

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

 

 

$ a=5; b=7; c=2

$ echo $(( a+b*c ))

19

$ echo $(( (a+b)/c ))

6

$ echo $(( (a*b)%c))

1

a=5; ((a++)) 可將 $a 重定義為 6

a=5; ((a--)) 則為 a=4

a=5; b=7; ((a < b)) 會得到 0 (true) 的返回值。

常見的用於 (( )) 的測試符號有如下這些:

 

<:小於

>:大於

<=:小於或等於

>=:大於或等於

==:等於

!=:不等於

 

2.()的用法

命令替代

语法:

$(command)

例子:

$pwd

/home/user2

$ curdir=$(pwd)

$ echo $curdir

/home/user2

$ cd /tmp

$ pwd

$ cd $curdir

$ pwd

/home/user2

以下的赋值语句:

$ curdir=$(pwd) $ curdir=`pwd`

pwd 的输出被赋给变量 curdir

 

使用- n参数显示实际在哪一行:

代码:

[sam@chenwy sam]$ grep -n '^$' myfile

 

if [  "`/usr/ucb/whoami`"  !=  "root"  ]; then

  echo "You must be root to run this script!"

  exit 1

fi

 

if [ "${msg}" = "" ] ;then

  echo "msg is null"

fi

 

 

shell Awk & Sed 正则表达式 强文:

___________________________________

1 >>inputfile

2 i=`cat inputfile|sed ...`

3 if [ $i =2  ]

  then

    ...

  fi

4 rm -f inputfile

___________________________________

 

\ 屏蔽特殊字符 

^ 匹配开始位置。

$ 匹配结束位置。

* 匹配前面的子表达式零次或多次。

. 匹配一个位置(例如.$表示最后一个字符)

+ 匹配前面的子表达式一次或多次。

? 匹配前面的子表达式零次或一次。

{n}  n是一个非负整数。匹配确定的 n 次。

{n,} n是一个非负整数。至少匹配n 次。

{n,m} mn均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。

[xyz]  匹配所包含的任意一个字符。 

[^xyz] 匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p' 

[a-z]  匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 'z' 范围内的任意小写字母字符。 

[^a-z] 匹配任何不在指定范围内的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 'z' 范围内的任意字符。

[^$] 对空行

[^.*$] 对匹配行中任意字符串

^......$ 对包括6个字符的行

^.$ 对仅有一个字符的行

^\.[0-9][0-9] 对以一个句点和两个数字开始的行

[a-zA-Z] 对任意单字符

[0-9]\{2\}-[0-9]\{2\}-[0-9]\{4\} 对日期格式dd-mm-yyyy

[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}IP地址格式nnn.nnn.nnn.nnn

\d  匹配一个数字字符。等价于 [0-9] 

\D  匹配一个非数字字符。等价于 [^0-9] 

\f  匹配一个换页符。等价于 \x0c \cL 

\n  匹配一个换行符。等价于 \x0a \cJ 

\r  匹配一个回车符。等价于 \x0d \cM 

\s  匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v] 

\S  匹配任何非空白字符。等价于 [^ \f\n\r\t\v] 

\t  匹配一个制表符。等价于 \x09 \cI 

\v  匹配一个垂直制表符。等价于 \x0b \cK 

\w  匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]' 

\W  匹配任何非单词字符。等价于 '[^A-Za-z0-9_]' 

 

Example:列出文件的1-4;

$cat ifile|sed -n '1,4p'    # method 1

$sed -n '1,4p' ifile        # method 2

$sed '8,12!d'  ifile        # method 3

$cat ifile|sed -n '1,4p;40p;45,50p' (列出文件的1-4,40,45-50;)

 

Example:列出包含sf56的行;

$cat ifile|sed -n '/sf56/p'

 

Example:列出包含sf|56的行(|不是转义字符);

$cat ifile|sed -n '/sf56/p'

 

Example:列出以 1. 开头的行(.为转义字符);

$cat inputfile|sed -n '/^1\./p'

 

Example:列出以 1. 开头的行(.为转义字符),且删除该行的最后一个字符;

$cat ifile|sed -n '/^1\./p'|sed 's/.$//'

 

Example:列出删除1-3行后的所有行;

$cat ifile|sed '1,3d'

 

Example:列出删除第一行的文件;

$cat ifile|sed '$d'

 

Example:列出删除最后两行的文件;

$cat ifile|sed 'N;$!P;$!D;$d'

 

Example:列出删除最后10行的文件;

$cat ifile|sed -e :a -e '$d;N;2,10ba' -e 'P;D'   # method 1

$cat ifile|sed -n -e :a -e '1,10!{P;N;D;};N;ba'  # method 2

 

Example:列出删除第3行到最后一行的文件;

$cat ifile|sed '3,$d'

 

Example:删除每行开头的空格或tab符号;

$cat inputfile|sed 's/^[ \t]*//'  # see note on '\t' at end of file

 

Example:删除每行末尾的空格或tab符号;

$cat inputfile|sed 's/[ \t]*$//'  # see note on '\t' at end of file

 

Example:删除每行开头和末尾的空格或tab符号;

$cat inputfile|sed 's/^[ \t]*//;s/[ \t]*$//'

 

Example:文件中有一行是MYPARAM=123,取得123这个参数值;

$cat ifile|sed '/^MYPARAM= */!d; s///;q'

 

Example:全局替换sf565566;

$cat ifile|sed 's/sf56/5566/g'

 

Example:列出以4结尾的行;

$cat inputfile|sed -n '/4$/p' 

 

Example:列出以 1-9. 开头的行;

$cat inputfile|sed -n '/^[1-9]\./p'

 

Example:列出最后一行;

 (print the last line of a file (emulates "tail -1")

$cat inputfile|sed '$!d'     # method 1

$cat inputfile|sed -n '$p'   # method 2

 

Example:列出包含sf564523的行;

$cat ifile|sed -e '/sf56/b' -e '/4523/b' -e d

 

Example:替换,全局替换,替换第几处...

# substitute (find and replace) "foo" with "bar" on each line

 sed 's/foo/bar/'             # replaces only 1st instance in a line

 sed 's/foo/bar/4'            # replaces only 4th instance in a line

 sed 's/foo/bar/g'            # replaces ALL instances in a line

 sed 's/\(.*\)foo\(.*foo\)/\1bar\2/' # replace the next-to-last case

 sed 's/\(.*\)foo/\1bar/'            # replace only the last case

 

 # substitute "foo" with "bar" ONLY for lines which contain "baz"

 sed '/baz/s/foo/bar/g'

 

 # substitute "foo" with "bar" EXCEPT for lines which contain "baz"

 sed '/baz/!s/foo/bar/g'

 

Example:DOS控制字符^M替换掉;

  # IN UNIX ENVIRONMENT: convert DOS newlines (CR/LF) to Unix format)

     sed 's/^M$//'              # in bash/tcsh, press Ctrl-V then Ctrl-M

     sed 's/.$//'               # assumes that all lines end with CR/LF

     sed 's/\x0D$//'            # gsed 3.02.80, but top script is easier

 

  # IN UNIX ENVIRONMENT: convert Unix newlines (LF) to DOS format

     sed "s/$/`echo -e \\\r`/"  # command line under ksh

     sed 's/$'"/`echo \\\r`/"   # command line under bash

     sed "s/$/`echo \\\r`/"     # command line under zsh

     sed 's/$/\r/'              # gsed 3.02.80

 

  # IN DOS ENVIRONMENT: convert Unix newlines (LF) to DOS format

     sed "s/$//"                # method 1

     sed -n p                   # method 2

 

  # IN DOS ENVIRONMENT: convert DOS newlines (CR/LF) to Unix format

  # Cannot be done with DOS versions of sed. Use "tr" instead.

     tr -d \r <infile >outfile  # GNU tr version 1.22 or higher

 

 

Example:删除文件中的所有空行和由空格组成的行;

$cat ifile|sed '/^$/d'|sed '/^[[:space:]]*$/d'    # method 1

$cat ifile|sed -e '/^$/d' -e '/^[[:space:]]*$/d'  # method 2

 

Example:文件中原来有一行hellohellohello,现在每个hello分一行,3;

$cat ifile|sed 's/hello/hello@/g'|tr '@' '\n'

(先将hello替换为hello@,然后用tr@替换为转义符换行\n;)

 

Example:变成每5个字符换一行;

$cat ifile|sed 's/\(.\{5,5\}\)/\1@/g'  | tr '@' '\n'

 

[]的用法在sed中表示取[]字符组中的一个字符,而[]中的第一位若是"^",则表示不取后面的任何一个字符。

那么 [^ /]* 就表示匹配这样的格式:"由不是空格或"/"的一个或多个字符组成的串.

 

\([^ /]*\) : 这里\(......\)的格式,这种格式用在需要替换的源串中,表示用这种符号括注的部分要sed记住,

而且sed会给这个部分自动起个名字叫\1,如果在源串中还有这样的标记,就依次命名为\2,\3......

\1sed记住什么呢?是括号里到\前面的"[^ /]*",这是说"由不是空格或/的一个或多个字符组成的串"

 

sed -e的写法可以使sed连续执行多套命令,例如在一行里面进行多重替换;

 

Example:替换".../...==""|--...",然后替换".../""|",

        注意第二步为替换任意多的"由不是空格或/的一个或多个字符组成的串""/"替换为仅"|";

$cat ifile|sed -e 's/[^ /]*\/\([^ /]*\) ==/|--\1/g' -e 's/[^ /]*\//| /g'

 

原来文件:

. /bin == (1kb)

. /bin/sbin/chenFile == (1kb)

. /bin/sbin/shell/dfdf == (1kb)

运行后显示:

. |--bin (1kb)

. | | |--chenFile (1kb)

. | | | |--dfdf (1kb)

 

 

Example:查找当前目录下的所有子目录,并显示其大小;(显示效果对第一第二列进行调整);

        sort -f是要把输出的结果排序,按字母顺序排序,便于使用的人察看。使用-f可以让sh排序时对大小写不敏感。

 

$find .  -type d -print | du | awk '{print $2, "== ("$1/2"kb)"}' |sort -f

 

原来du显示:

4640    ./cc/sh_frt_unix/src

1136    ./cc/sh_frt_unix/tmp

195352  ./cc/sh_frt_unix

 

运行后显示:

./cc/sh_frt_unix/src == (2320kb)

./cc/sh_frt_unix/tmp == (568kb)

./cc/sh_frt_unix == (97676kb)

 

Example:以上两个shell结合

$find .  -type d -print | du | awk '{print $2, "== ("$1/2"kb)"}' |sort -f|sed -e 's/[^ /]*\/\([^ /]*\) ==/|--\1/g' -e 's/[^ /]*\//| /g'

 

Example:判断目录是否存在;

    if [ ! -d $HOME/cc ];then

      echo "dir not exist\n"

      mkdir -p cc

    else

      echo "dir exist\n"

    fi

*************用正则表达式进行字符串处理(shell变量)********************

 

#列出文件中包含sf56的一行,假设结果是1.adfdsf56345345

$i=`cat ifile|sed -n '/sf56/p'`

 

#从变量i的最左边开始删除字符,直到第一个“f”:结果是dsf56345345

$j=${i#*f}

$echo $j

 

$echo {i##*/}  从变量i的最左边开始删除字符,直到最后一个“/

$echo ${i#*.}  从变量i的最左边开始删除字符,直到第一个“.

$echo ${i##*.} 从变量i的最左边开始删除字符,直到最后一个“.

$echo ${i%/*}  从右部开始拿掉字符,直到遇到(从右部数起的)第一个“/

$echo ${i%%/*} 从右部开始拿掉字符,直到遇到(从右部数起的)最后一个“/

$echo ${i%.*}  从右部开始拿掉字符,直到遇到(从右部数起的)第一个“.

$echo ${i%%.*} 从右部开始拿掉字符,直到遇到(从右部数起的)最后一个“.

 

$echo ${i#????}   去掉前面4个字符

$echo ${i%????}   去掉后面4个字符

$echo ${i#*[0-9]} 去掉前面所有的数字字符

$echo ${i#1.a}    去掉前面的字符"1.a"

 

$str=20041012

$echo $str|cut -c 1-4  取前面4个字符;

$echo $str|cut -c 5-7  5-7个字符; (--------Sed是基于行处理的,而进一步处理用cut-------)

 

$i=`cat ifile|sed '/abc/='`         #获得abc所在行的行号;

$cat ifile|sed -n '1,3p'            #显示13行;

$cat ifile|sed -n '/abc/p'          #显示包含abc的行;

$cat ifile|sed '5,$d'               #删除5-最后一行;

$cat ifile|sed '/abc/d'             #删除包含abc的行;

$cat ifile|sed 's/^.//g'            #删除第一个字符;

$cat ifile|sed 's/.$//g'            #删除最后一个字符;

$cat ifile|sed 's/abc/ABC/g'        #全局替换;

 

**** 一个自动ftpshell **************************************

F="myftp"

#如果提供了参数则上传参数文件,否则上传所有文件;

toputfile=${1:-*}

echo "open 144.4.0.202 21"      > $F

echo "user dpdb_trs dpdb_trs"   >> $F

#二进制传输;

echo "bin"                      >> $F

echo "cd cc/sbin"               >> $F

echo "mput $toputfile"          >> $F

echo "bye"                      >> $F

 

ftp -i -in < $F 

rm -rf $F

**************************************************************

*******一个定时Job的写法(by crontab)**************************

Backup.sh文件:

   # Delete job;

   crontab -r

   #Add job;

   crontab backup_cron

   #List now job;

   crontab -l

backup_cron文件:

   #执行某个Shell at everyday 2:00 am

   0 2 * * * /$HOME/my_unix/sbin/backup.sh

   #执行某个Shell at every 1st of month

   0 2 1 * * /$HOME/myt_unix/sbin/backup_cleanMon34.sh

**************************************************************

if [ 某条件 ]; then

  some statement

fi

 

有的脚本用

if [[ 某条件 ]]; then

  smoe statement

fi

---[[]]支持通配符,不同的shell会支持不一样的.bounse shell 应该不支持[[  ]],ksh [[ ]]应该支持

 

一般情况下,$var ${var} 并没有啥不一样。

但是用 ${ } 会比较精确的界定变量名称的范围,比方说:

$ A=B

$ echo $AB

原本是打算先将 $A 的结果替换出来,然后再补一个 B 字母于其后,

但在命令行上,真正的结果却是只会提换变量名称为 AB 的值出来。若使用 ${ } 就没问题了。

 

 

 UNIX          |  SED  

---------------+----------------------------------------------------------------

 cat           |  sed ':'

 cat -s        |  sed '/./,/^$/!d'

 tac           |  sed '1!G;h;$!d'

 grep          |  sed '/patt/!d'

 grep -v       |  sed '/patt/d'

 head          |  sed '10q'

 head -1       |  sed 'q'

 tail          |  sed -e ':a' -e '$q;N;11,$D;ba'

 tail -1       |  sed '$!d'

 tail -f       |  sed -u '/./!d'

 cut -c 10     |  sed 's/\(.\)\{10\}.*/\1/'

 cut -d: -f4   |  sed 's/\(\([^:]*\):\)\{4\}.*/\2/'

 tr A-Z a-z    |  sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'

 tr a-z A-Z    |  sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'

 tr -s ' '     |  sed 's/ \+/ /g'

 tr -d '\012'  |  sed 'H;$!d;g;s/\n//g'

 wc -l         |  sed -n '$='

 uniq          |  sed 'N;/^\(.*\)\n\1$/!P;D'

 rev           |  sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'

 basename      |  sed 's,.*/,,'

 dirname       |  sed 's,[^/]*$,,'

 xargs         |  sed -e ':a' -e '$!N;s/\n/ /;ta'

 paste -sd:    |  sed -e ':a' -e '$!N;s/\n/:/;ta'

 cat -n        |  sed '=' | sed '$!N;s/\n/ /'

 grep -n       |  sed -n '/patt/{=;p;}' | sed '$!N;s/\n/:/'

 

2 尝试在at里面套at,

  $at 9.00am tomorrow -f /usr/abc/abc.sh

3 at -l

  atrm job 3

 

4 nohup abc.sh >>abc.log 2>&1 & (后台运行并重定向)

 

7 if [ $1 =0 ]

  then

    ...

  elif [ $1 = 1 ]

  then

    ....

  else

    ....

  fi

 

8 if [ ! -w "abc.txt" ];then

    echo "can't write"

  fi                           #test if can write

 

9 if [ ! -d /abc/def ];then

 

10 if [ -z $APP_DIR ] || [ "$APP_DIR" = "" ];then

     echo "environment variable not set"

     export APP_DIR=/dev/abc;

   fi

 

11 du -s 显示每个目录占用硬盘大小,结果为块,如128,表示128块,每块512字节;

   df -k 显示磁盘占用情况;

 

12 head -2 ifile 显示文件的前两行;

13 cp -r 拷贝目录以及子目录;

14 rm -rf 删除目录以及文件;

 

Shell脚本例子:

 

自动Ping远端地址:

###############################################

###   myping                               ###

###   author:Mainz                          ###

###   2004.11.29                            ###

###   line.txt – ServerName 192.168.26.15       ###

###############################################

loop=1

while read LINE

do

  echo "${loop}. `echo ${LINE}|awk '{print $1}'`"

  ping -q -c 1 -w 2 `echo ${LINE}|awk '{print $2}'` 2 > /dev/null

  if [ $? = 0 ];then

    echo "---OK"

  else

    echo "---  XX"

  fi

  loop=`expr ${loop} + 1`

done < line.txt

posted on 2008-01-05 17:18  Mainz  阅读(12326)  评论(2编辑  收藏  举报

导航