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
调试命令见其他
)
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
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}’’
echo “delete PID $i”
kill -9 $i
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 ))
$ echo $(( (a+b)/c ))
$ echo $(( (a*b)%c))
a=5; ((a++))
可將
$a
重定義為
6
a=5; ((a--))
則為
a=4
a=5; b=7; ((a < b))
會得到
0 (true)
的返回值。
常見的用於
(( ))
的測試符號有如下這些:
<=
:小於或等於
>=
:大於或等於
==
:等於
!=
:不等於
2.()
的用法
$(command)
/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
if [ "${msg}" = "" ] ;then
echo "msg is null"
shell Awk & Sed
正则表达式
强文
:
___________________________________
1 >>inputfile
2 i=`cat inputfile|sed ...`
3 if [ $i =2
]
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
echo "dir exist\n"
*************
用正则表达式进行字符串处理
(
对
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
有的脚本用
if [[
某条件
]]; then
smoe statement
---[[]]
支持通配符
,
不同的
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 ]
elif [ $1 = 1 ]
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;
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
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"
echo "---
XX"
loop=`expr ${loop} + 1`
done < line.txt