Shell常用命令 [转]
原文出处:http://www.cnblogs.com/Mainz/articles/1027168.html
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<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 替换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 < 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} m和n均为非负整数,其中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:全局替换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 <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......。
这"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 < $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