资源描述
LINUX与UNIX SHELL编程指南
第一章:文件安全与权限
1)
margin@linux:~/myfile> ll
total 4该目录中所有文件所占的空间
drwx文件属主权限
r-x同组用户权限
r-x其它用户权限
2该文件硬连接数目
hsinfo 文件的属主
users文件的属主所在的缺省组
80 用字节来表示的文件长度
2009-08-27 16:41文件的更新时间
ace文件名
drwxr-xr-x 2 margin users 328 2009-12-04 10:55 bak
-rw-r--r-- 1 margin users 48 2009-12-01 10:58 my.txt
drwxr-xr-x 2 margin users 208 2009-12-04 10:57 test
2)文件类型
d 目录
l 符号连接(指向另一个文件)
s 套接字文件
b 块设备文件
c 字符设备文件
p 命名管道文件
- 普通文件(更准确的说,不属于以上几种类型的文件)
3)权限更改命令
$ chmod u-x,g+r,o+r my.txt
$ chmod 644 my.txt
rwx对应421;最高权限777
第二章:使用find 和 xargs
1)find 命令
margin@linux:~/myfile> find . -type f -size +100000c -name "*.rar" -mtime +10 -exec ls -l {} \;
. 代表当前目录;~代表$HOME目录;/ 代表根目录
$find . –name “*.tar” –print
在当前目录查找文件名以大写字母开头的文件:
$find . –name “[A-Z]*” –print
在当前目录查找文件名以两个小写字母开头,跟着是两个数字,最后是*.txt的文件:
$find . –name “[a-z][a-z][0-9][0-9].txt” –print
在当前目录查找文件权限为755的文件,即文件主属可以读、写、执行,其它用户可以读、执行的文件,可以用:
$find . –perm 755 –print
按文件属主查找文件:find . –user hsinfo -print
margin@linux:~/myfile> find -user hsinfo -exec ls -l {} \;
total 8032
-rwxr-xr-x 1 hsinfo users 8215920 2009-08-27 16:40 libACE.so.5.5.0
-rwxr-xr-x 1 hsinfo users 8215920 2009-08-27 16:40 ./ace/libACE.so.5.5.0
在home下查找属主账户已经被删除的文件可以用:
$find /home –nouser –print
在当前目录下查找5天以内的文件
$find . –mtime -5 -print
在当前目录下查找5天以前的文件
$find . –mtime +5
在当前目录下查找文件长度大于1M的文件,可以用:
$find . –size +1000000c –print /////////c是以字节计量
$ find . -name "[a-z]?[0-9]?[!0-9a-z]*"
2)exec和ok命令
第三章:后台执行命令
1)Crontab
2) at 命令
3)& 命令(使用它在后台运行一个占用时间不长的进程)
看下例:18141是进程号
margin@linux:~> ps x |grep 18141
5280 pts/0 S+ 0:00 grep 18141
4)nohup 命令
第四章:文件名置换
2)使用?号
3)使用 [ … ] [! …]
总结:
margin@linux:~> ls [a-z]?_*[0-9].[!0-9]*
jr_sim20090823.tgz
margin@linux:~> ls [a-z]?[!a-z,0-9][a-z]??[0-9]*.*[a-z]
jr_sim20090823.tgz
第五章:shell输入与输出
1) echo
\c不换行; \f进纸; \t 跳格; \n换行
margin@linux:~> echo "What is your name?"
What is your name?
margin@linux:~> echo -e "here is a tab\there is two tabs\tok"
here is a tab here is two tabs ok
如果想输出引号,可以用反斜杠,如下:
margin@linux:~> echo "\"/home/margin"\"
"/home/margin"
把输出结果保存到名叫myfile的文件中:
margin@linux:~/myfile> echo "Good job!" >myfile
margin@linux:~/myfile> cat myfile
Good job
把输出结果追加到名叫myfile的文件中:
margin@linux:~/myfile> echo "why not?">>myfile
margin@linux:~/myfile> cat myfile
Good job
why not?
2) read
例一:
margin@linux:~/myfile> read var
good job good job good job
margin@linux:~/myfile> echo $var
good job good job good job
例二:
margin@linux:~/myfile> read var1 var2
good job good job
margin@linux:~/myfile> echo $var1
good
margin@linux:~/myfile> echo $var2
job good job
3) cat
4) 管道
5) tee
6) 标准输入、输出和错误
7) 文件重定向
例一:
margin@linux:~/myfile/test> grep 'oo' c.txt
oooooooooaaaaoooooooooooiiii
ooooojji2jajaaaiii
ooo
下面把以上查找结果定向到dx文件中:
margin@linux:~/myfile/test> grep 'oo' c.txt >dx
查看dx文件内容:
margin@linux:~/myfile/test> cat dx
oooooooooaaaaoooooooooooiiii
ooooojji2jajaaaiii
ooo
把以下查找结果追加到dx中:
margin@linux:~/myfile/test> grep 'oo' c.txt |grep 'jj' >>dx
margin@linux:~/myfile/test> cat dx
oooooooooaaaaoooooooooooiiii
ooooojji2jajaaaiii
ooo
ooooojji2jajaaaiii追加的内容
第六章:命令执行顺序
margin@linux:~/myfile/test> grep 'jj' dx && cat c.txt
margin@linux:~/myfile/test> grep 'jj' dx || cat c.txt
第七章:正则表达式介绍
margin@linux:~/myfile> cat my.txt
用touch命令创建的文件
也可以用vi命令来创建
ddd
以上是my.txt的内容,在下面的例子中将用到。注意在my.txt中有一个空行。
1) “.”可以匹配任意单字符(一个 . 代表一个字符)
例:$ grep .touch* my.txt
用touch命令创建的文件
$ grep ....vi..... my.txt
也可以用vi命令来创建
2) 在行首以 ^ 匹配字符串或字符序列
例:
$ grep ^用 my.txt
用touch命令创建的文件
$ grep ^用to my.txt
用touch命令创建的文件
3) 用 $ 匹配行尾字符串或字符,和 ^ 正好相反。
例:
$ grep 文件$ my.txt
用touch命令创建的文件
$ grep ^$ my.txt
注:以上结果是空行。
4) 使用 * 匹配字符串中的单字符或其重复序列
例:
5) 使用 \ 屏蔽一个特殊字符的含义
6) 用 [ ] 匹配一个范围或集合
7) 用 \{\} 匹配模式结果出现的次数
8) 例子
第八章:grep 家族
#输出没有点的行
$ grep -v '\.' my.txt
$ grep -nv 'ddd' my.txt
第九章:AWK 介绍
1) AWK 命令
一般形式为:awk [-F 域分隔符] ‘命令’ 文件名
[ ] 为可选项,默认空格为域分隔符。如果文件中各列之间本来就是用空格分隔则可直接简化为:awk ‘命令’ 文件名
#显示出所有的列
margin@linux:~/myfile> awk '{print $0}' aa22.txt
ooo aaa bbb ccc
ddd eee fff gg
hh ii ll mm
#将第一列输出到fff中
margin@linux:~/myfile> awk '{print $1}' aa22.txt >fff
margin@linux:~/myfile> awk 'grep ^o ' aa22.txt
2)
3)如果第三列是fff则打印出来:(正则表达式要用斜线括起来,本例中 /fff/ )
margin@linux:~/myfile> awk '{if($3~/fff/) print $0}' aa22.txt
ddd eee fff gg
下面的语句可以达到同样的效果
margin@linux:~/myfile> awk '$0 ~ /fff/' aa22.txt
ddd eee fff gg
如果第三列等于fff则打印:
margin@linux:~/myfile> awk '$3=="fff" {print $0}' aa22.txt
ddd eee fff gg
如果第三列不等于fff则打印:
margin@linux:~/myfile> awk '$3!="fff" {print $0}' aa22.txt
ooo aaa bbb ccc
hh ii ll mm
如果第三列不匹配fff则打印:
margin@linux:~/myfile> awk '$3 !~ /fff/ {print $0}' aa22.txt
ooo aaa bbb ccc
hh ii ll mm
hh
margin@linux:~/myfile> awk '/^hh/' aa22.txt
hh ii ll mm
4)
如果第一列匹配hh并且第二列等于ii 则打印:(注意大括号范围)
margin@linux:~/myfile> awk '{if ($1~/hh/ && $2=="ii") print $0}' aa22.txt
hh ii ll mm
如果第一列匹配hh或者第三列匹配 fff 则打印:(注意大括号范围)
margin@linux:~/myfile> awk '{if ($1~/hh/ || $3~/fff/) print $0}' aa22.txt
ddd eee fff gg
hh ii ll mm
$ awk 'END {print NR}' aa22.txt
5
margin@linux:~/myfile> awk '{print NF}' aa22.txt
4
0
4
4
0
$ awk 'END {print NR,NF}' aa22.txt
$ echo "88 99" | awk '{printf "%c%c\n",$1,$2}'
Xc
第十章:sed用法介绍
打印第二行
$ sed '2p' aa22.txt
ooo aaa bbb ccc
ddd eee fff gg
hh ii ll mm
$sed -n '2p' aa22.txt
打印第三行
margin@linux:~/myfile> sed -n '3p' aa22.txt
ddd eee fff gg
打印3-4行
margin@linux:~/myfile> sed -n '3,4p' aa22.txt
ddd eee fff gg
hh ii ll mm
打印匹配行
margin@linux:~/myfile> sed -n '/gg/'p aa22.txt
ddd eee fff gg
打印一到最后一行
$ sed -n '1,$p' aa22.txt
第十一章:合并与分割
$ sort aa22.txt
显示结果未分类
#逆序分类:
$ sort -r aa22.txt
ddd d0u d1u ddi ddy
ccc c.c c.6 c.88 c.99
bbb bb2 bb3 bb4 bb5
aab 12q 3cc bbc ccd
aaa aa2 aa3 aa4 aa5
#对第二列进行排序
$ sort +1n h
lili 22
dongdong 33
zhanghua 88
xiaoming 98
piaopiao 100
使用K进行排列
margin@linux:~/myfile> sort -r -k2 h
xiaoming 98
zhanghua 88
dongdong 33
lili 22
piaopiao 100
使用K进行排列
margin@linux:~/myfile> sort -k2 h
例:这里有两个文件 h 和 w;它们的内容分别为
$cat h
xiaoming 98
zhanghua 88
piaopiao 100
lili 22
dongdong 33
lili 22
lili 22
$cat w
xiaoming 1
zhanghua 2
piaopiao 3
lili 1
dongdong 3
lili 2
lili 2
现在将w 和h 连起来
$ join w h
xiaoming 1 98
zhanghua 2 88
piaopiao 3 100
lili 1 22
dongdong 3 33
lili 2 22
lili 2 22
lili 2 22
lili 2 22
margin@linux:~/myfile> cut -c1 h
x
z
p
margin@linux:~/myfile> cut -c1-3 aa22.txt
aaa
bbb
ccc
ddd
aab
第十二章:tr用法
aa22.txt文件的原始内容如下:
$ cat aa22.txt
aaa aa2 aa3 aa4 aa5
bbb bb2 bb3 bb4 bb5
下面用tr去除重复出现的字符
$ tr -s "[a-z]"<aa22.txt
a a2 a3 a4 a5
b b2 b3 b4 b5
$ cat my.txt
用touch命令创建的文件
也可以用vi命令来创建
ddddddd
d.pas
$ tr -s "[\012]"<my.txt
用touch命令创建的文件
也可以用vi命令来创建
ddddddd
d.pas
把文本h中所有不是[a-z][A-Z]范围字符的字符替换成“换行(就是新的空行)”:
$ tr -c "[a-z][A-Z]" "\012" <h
把文本h中所有不是[a-z][A-Z]范围字符的字符替换成换行;然后把新行都删除。
例如删除文本中的数字
$ tr -cs "[a-z][A-Z]" "\012" <h
第十三章:登录环境
第十四章:环境和shell变量
$ ./jyctl.sh$0 (文件名)
start$1 (就是第一个参数,如果有第二个参数用$2表示,依次类推:$3 $4 $5)
下面我建一个sh脚本:
$ vi u.sh
if [ "10" -lt "12" ]; then
echo "10 is less than 12"
fi
$ ./u.sh
10 is less than 12
$ vi u.sh
if [ "10" -lt "12" ]; then
echo "10 is less than 12"
fi
#下面测试while循环
while :
do
echo "请输入一个介于1和5之间的数字:"
read ans
case $ans in
1|2|3|4|5) echo "你输入了一个介于1和5之间的数字!"
;;
*)echo "你输入了一个不合要求的数字,再见!!!"
break #跳出整个while 循环
;;
esac
# if [ "$ans" -gt "10" ]; then 这里的if语句永远不会执行,所以注释掉
# break
# fi
done
$ ./u.sh
10 is less than 12
请输入一个介于1和5之间的数字:
3
你输入了一个介于1和5之间的数字!
请输入一个介于1和5之间的数字:
9
你输入了一个不合要求的数字,再见!!!
$ more jyctl.sh
#!/bin/sh
#
# Script for jysrv controlling
# Written by Westwild
#
checkPidFile() {
[ -f "$1" ] || return 1
kill -0 `cat "$1"` 2>/dev/null || return 1
return 0
}
case "$0" in
/*) BINDIR=`dirname $0`;;
*/*) BINDIR=`pwd`/`dirname $0`;;
esac
cd $BINDIR
BINDIR=`pwd`
JYMONPID=$BINDIR/../logs/.jymonpid
JYPID=$BINDIR/../logs/.pidlog
JYGID=$BINDIR/../logs/.jygid
if [ ! -f $BINDIR/mon_jysrv ]; then
echo "ERROR -- mon_jysrv not found in the jysrv's bin directroy." >&2
exit 2
fi
if [ ! -x $BINDIR/mon_jysrv ]; then
echo "ERROR -- cannot execute mon_jysrv -- Permission denied ?" >&2
exit 3
fi
case "$1" in
start)
echo "Start jysrv, Please waiting..."
if checkPidFile $JYMONPID; then
echo "mon_jysrv already running (pid `cat $JYMONPID`)."
else
rm -f $JYMONPID
rm -f $JYGID
$BINDIR/mon_jysrv &
PID=$!
echo $PID > $JYMONPID
PGID=`ps -o pid -o pgid|awk '{if($1=='$PID') print $2;}'`
echo $PGID > $JYGID
fi
echo "OK"
;;
stop)
echo "Stop jysrv, Please waiting..."
# stop mon_jysrv
[ -f $JYMONPID ] && kill `cat $JYMONPID` > /dev/null 2>/dev/null
[ -f $JYMONPID ] && kill -9 `cat $JYMONPID` > /dev/null 2>/dev/null
rm -f $JYMONPID
# stop JM_Svc
[ -f $JYPID ] && kill `cat $JYPID` > /dev/null 2>&1
sleep 1
[ -f $JYPID ] && kill -9 `cat $JYPID` > /dev/null 2>&1
rm -f $JYPID
# stop JR_Svc
[ -f $JYGID ] && kill -15 -`cat $JYGID` >/dev/null 2>&1
sleep 1
[ -f $JYGID ] && kill -9 -`cat $JYGID` >/dev/null 2>&1
rm -f $JYGID
echo "OK"
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
;;
esac
exit 0
#-----------------------------------------------------
#定位函数
例:
$ cat >>jjj<<nn
> kkk
> kkkd
> nn
$ cat jjj
kkk
kkkd
展开阅读全文