Shell基本命令

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’ 设置快捷shell名pss,常用在.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 调试attach到PID(有关dbx调试命令见其他)

    

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

    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

    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 替换abc为def

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

    dd删除一行

    J 删除一行带回车

    Yy 复制一行, p粘贴

    

    Shell与Sed常用用法

    

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

    文件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 會得到 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} m和n均为非负整数,其中n 。最少匹配 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:全局替换sf56为5566;

    $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:列出包含sf56或4523的行;

    $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 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......。

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

    

    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' #显示1-3行;

    $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' #全局替换;

    

    **** 一个自动ftp的shell **************************************

    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

    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

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值