Shell 基本命令

来源:互联网 发布:mac是什么档次化妆品 编辑:程序博客网 时间:2024/04/29 03:15
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 )) 

$ 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 
0 0
原创粉丝点击