1. 描述,shell是unix/linux下强劲的脚本工具,对提高我们的工作效率很有好处,这是学习过程中的一些笔记,(整理的很垃圾,汗~~)。C++实验室(http://www.ctag.cn)原创,转载请保留。
2. shell简介(2005-11-22 morning)
a)
3种主流shell:bourne shell,
c shell, korn shell
b)
查看所有shell:/etc/shell
c)
系统启动->init进程->/bin/login->设置HOME,SHELL,USER环境变量及PATH
d)
shell从login中继承大量的环境变量,io流及进程特性
e)
umask值一般为0022,如创建目录缺省权限为777,创建后减去0022为755
f)
u用户,g组,go其他组,a所有
g)
如cd的命令是嵌入到shell中的
3. 正则表达式
a)
例子(vi中): 1,$ s/\<[Tt]om\>/David/g g是全程操作标识
b)
^,$行首位脱字符
c)
.,*匹配1个,或0个以上字符
d)
[]匹配一组字符中一个
e)
[x-y]匹配范围中一个
f)
[^]匹配不再组内的字符
g)
\转义
h)
\<,\>,单词定界符,单词的查找和一般的字符串查找不同
i)
\(..\)标签
j)
x\{m,n\}重复的x
k)
例子(以下均在vi中):
i.
/o*ve 匹配0个以上o开头紧接ve字符串
ii.
/ove[a-z] ove紧接一个a到z的字符串
iii.
/ove[^a-zA-Z0-9]/ ove紧接如标点的字符串
iv.
/\<f.*th\>/ f开头,跟0个或多个任意字符(.*)th结尾的字符串
v.
1,$ s/\([Oo]ccur\)ence/\1rence/ 替换O/occurence为O/occurrence
vi.
s /\(square\) and \(fair\) /\2 and
\1/ 调换square和fair位置
4. grep家族;好处是不用启动编辑器,比ex和vi快
a)
元字符:^,$,.,*,[],[^],\<,\>,\(..\),x\{m,n\}
b)
grep重要选项:c显示行号,h不显示文件名,i忽略大小写,l只显示文件名,n显示行号,v显示不匹配的,w搜索单词
c)
grep ‘root’ /etc/passwd,返回值在$?变量,成功为0,未找到为1,失败为2
d)
例子:grep abc d*
e)
grep ‘[^0-9]’ datafile
f)
grep ‘\<north’ datafile 以north开头的单词,\<是词首定位符号
g)
grep ‘\<north\>’ datafile
h)
ls –l | grep ‘^d’ 所有文件夹显示
i)
grep –n ‘south’ datafile
j)
grep –I ‘pat’ datafile
k)
grep –v ‘aaa’ datafile > temp; mv temp datafile 删除含aaa的行
l)
grep –c ‘west’ datafile
m) egrep ‘aaa|bbb’ datafile 搜索含aaa或bbb行
5. sed
a)
sed是一个精简的非交互式编辑器,没有破坏性。
b)
原理:将文件读取一行,放到模式空间(一个缓冲区),处理,然后输出到屏幕,再读取下一行,重复之
c)
格式:sed ‘command’
filename
d)
命令:a\追加,c\替换,d删除,i\插入,h拷贝到缓冲区,H替换缓冲区,g取出缓冲替换当前,G取出缓冲追加当前,p打印,n读取下一行,q结束,r读取文件,!不匹配的行,s替换,g全程操作,p打印,w写入,x交换,y替换字符
e)
sed选项:-e多项编辑,-f指定文件,-n取消缺省输出
f)
sed返回值,$?值:成功为0,失败其他
g)
元字符:和grep相同
h)
例子:
i)
sed ‘1,3d’ file 删除1到3行并输出
j)
sed ‘/Tom/d’ file 删除含tom的行
k)
sed ‘/Tom/!d’ file 删除不含tom的行
l)
sed ‘/north/p’ file 含north的行打印2遍
m) sed –n ‘/north/p’ file 含north的行打印1遍
n)
sed ‘3d’ file 删除第3行
o)
sed ‘3,$d’ file
p)
sed ‘$d’ file
q)
sed ‘/north/d’ file
r)
sed ‘s/west/north/g’ file 替换
s)
sed –n ‘s/west/north/g’ file 只打印替换的项
t)
sed ‘s/[0-9][0-9]$/&.5/’ file 以2个数字结尾的加上.5
u)
sed –n ‘s/aaa/bbb/gp’ file 全程替换并打印
v)
sed –n ‘/west/,/east/p’ file 打印west开始,直到有east的行
w) sed –n ‘5,/^north/p’ file 从5行打印直到有north开头的行
x)
sed ‘/west/,/east/s/$/**AAAA**/’ file
y)
sed –e ‘1,3d’ –e ‘s/aaa/bbb/’ file
z)
sed ‘/aaaa/r file2’ file1 找到aaaa就读file2
aa) sed –n ‘/aaaa/w file2’ file1 匹配aaaa的行写到file2
bb) sed ‘/aaaa/a\\bbbb’ file 再aaaa行后追加bbbb新行(可接多行)
cc) sed ‘/aaaa/i\\bbbb’ file 插入新行再前面行
dd) sed ‘/east/{n; s/aaaa/bbbb/;}’ file 找到east的行,在下一行匹配aaaa为bbbb
ee) sed ‘1,3y/ abcdefghijklmnopqrstuvwxyz/ ABCDEFGHIJKLMNOPQRSTUVXYZ/’
file
ff) 1到3行的小写字母改为大写
gg) sed ‘5q’ file 打印5行就撤
hh) sed ‘/aaaa/{s/aaaa/bbbb/;q;}’ file 换完就撤
ii)
sed –e ‘/aaaa/h’ –e ‘$G’ file aaa行缓存并最后打印
jj)
sed –e ‘/aaaa/h’ –e ‘$g’ file
kk) sed脚本例子:
ll)
例1
#sed example1
/aaaa/a
dsafdsafdsafdsafsd
safdsafsdafdsafds
fdsafdsafdsafdsafs
/bbbb/c
***********
fdsafdsafdsafds
***********
li
fdsafdsafdsafdsfds
---------
$d
mm) 例2
/aaaa/,/bbbb/,{
/^ *$/d
/cccc/{h;d;}
}
/eeee/g
s/TB
\(hhhh\)/iiii \1/
6. awk
a)
awk用途:处理数据和生成报告的编程语言
b)
命令格式:awk ‘pattern’
filename
awk ‘{action}’ filename
awk ‘pattern {action}’
filename
command | awk ‘pattern’
command | awk ‘{action}’
command | awk ‘pattern
{action}’
c)
print打印,printf格式化打印
d)
awk实例:
e)
awk ‘/aaaa/’ file
f)
awk ‘{print $1}’ file $1表示字段1,$0表示整个记录
g)
awk ‘/aaaa/{print $1, $2}’ file
h)
df | awk ‘$4 > 75000’
i)
rusers | awk ‘/root$/{print $1}’
j)
date | awk ‘{print “month: $2 “\nyear:
“, $6}’
k)
awk ‘/aaaa/{print “\t\t have a nict
day,” $1, $2 “\!”}’ file
l)
echo “unix” | awk ‘{printf “%-15s\n”,
$1}’
m) awk ‘{printf “the name is: %-15s id is %8d\n”, $1, $3}’ file
print自动换行,printf手动换行加上\n,%-15s左对齐
n)
awk文件:/^root/{print “hello, world”}
{print $1, $2, $3}
调用:awk –f awkfile file1
o)
$0整个记录,NR当前记录号,NF当前记录的字段数
p)
字段分隔符的一个例子:
q)
nawk –f ‘[ :\t]’ ‘{print $1, $2, $3}’ file1
r)
正则支持同egrep
s)
~匹配记录字段,如:
t)
awk ‘$1 ~ /[bB]ill/’ file1
u)
!~不匹配,如:awk ‘$1
!~ /aaa$/’ file1 显示不以aaa结尾的记录
7. awk编程结构
a)
表达式支持
表达式
含义
<
<=
==
!=
>=
>
~
匹配正则
!`
不匹配正则
a?b:c
If a is true, return b, else return c
&&
逻辑与
||
逻辑或
!
逻辑非
b)
实例:
c)
awk ‘$3 == 3456’ file
d)
awk ‘$3 > 5000{print $1}’ file
e)
awk ‘$2 ~ /aaaa/’ file
f)
awk ‘$2 !~ /aaaa/’ file
g)
awk ‘{max=($1 > $2)?$1:$2; print
max}’ file1
h)
awk ‘$3 * $4 > 500’ file 如果3,4字段乘积大于400则打印整个记录
i)
awk ‘$3 == 100 || $4 > 50’ file
j)
awk ‘!($2 <100 && $3<20)’
file
k)
awk ‘/aaaa/,/bbbb/’ file 范围模式
8. awk编程,本章有些复杂,只是看懂了,懒得作笔记,^_^,(2005-11-23)
9. bourne shell概念
a)
启动:initàgettyà/bin/loginà初始化环境àshell(/bin/sh)
b)
shell过程:执行/etc/profileà/~/.profileà接收用户命令
c)
/~/.profile(linux为.bash_profile)常用于定制&修改shell环境,启动程序或数据库等
d)
常用的环境变量:
变量
描述
PS1
主提示符
PS2
次提示符
PATH
$?
返回值(unix惯例为0)
$!
最后一个作业进程id
e)
hash命令:路径hash表控制,hash –r清空hash表
f)
dot命令执行shell脚本,如:.
Myscript
g)
命令编组:例子(ls;
pwd; date) > file1
h)
元字符:\转义,&后台处理,;分隔命令,$替换变量,?匹配单字符,[abc]匹配其中一个字符,[!abc] 匹配非其中字符,*匹配0或多个字符
i)
环境变量:export导出变量可用于子shell,set所有环境变量(局部和全局),env只显示全局,unset复位局部或全局变量,readonly保护变量
j)
展开修饰符:${variable:-word}无则代入值,${variable:=word}无则代入并设置值到变量,${variable:+word}有则代入值,${variable:?word}有则代入无则退出脚本
k)
位置参量:
变量
描述
$0
Shell脚本名
$1-$9
1到9个位置的参量
$#
参数个数
$*
所有参数
l)
函数:function_name(){commands;
commands;}注意最后分号
m) io重定向
变量
描述
<
>
>>
追加
2>
错误重定向
2>&1
错误重定向输出
n)
here文档与重定向输入:cat << FINISH
>*****************
>*****************
>*****************
>FINISH
o)
shell编程格式:第一行#!/bin/sh指定shell
p)
echo 自动换行
q)
算术运算:+-*/%
r)
修饰符“:?”检查$1是否有值,无则打印指定信息并退出,例子:
s)
name=${1:?”requires an argument} 在shell脚本中使用
t)
*@意义,如:set ‘aaa bbb’ ccc ddd
for i in “$@” 解释为3个参数,无引号解释为4个参数
u)
st命令或[](说明:方括号和等号两侧要求空格)
v)
测试运算符:-z sring字符串长度为0;-n string字符串长度不为0
-d filename目录存在;-f filename文件存在
=字符串相等;!=不等
w) exit退出shell脚本
x)
流程控制:if/else/then/elif/
case/in/value/;;/esac/
for/in/do/done
while [command] do commands
done
until [command] do commands
done
shift左移位置参量
set设置位置参量
continue循环下一个, break退出循环
y)
例子:for person
in ‘cat user_table_file’
do
mail $person <
letter_file
echo $person was sent a
letter
done
echo “all mail send ok”
z)
例子:while true;
do
read aaa
if [“$aaa” = y –o
“$aaa” = Y ]
then
break
if
done
aa) shell判断优先级:内置命令à函数à可执行程序
bb) 函数不能向子shell输出
cc) 陷阱trap和变量一样,函数中有陷阱会被整个shell共享
dd) 经典陷阱例子:trap ‘rm tmp*; exit 1’ 1 2 15挂起或信号则删除临时文件
trap ‘trap 2’ 2按2次ctrl+c则杀掉进程
ee) getopts处理命令行选项
ff) shell内置命令:
gg)
break,continue,eval,exec,exit,hash,export,kill,login,pwd,read,readonly,return,set,shift,stop
pid,suspend,times,trap,type,umask,unset,wait,umask
hh) history显示历史
10. bash shell
a)
bash启动:àinit进程(PID=1)
à派生getty进程(打开终端端口,提供stdin,stdout,stderr,登陆符)
à执行/bin/login:输入口令,加密并验证,设置出世环境,
启动用户登陆的shell(即/bin/bash)
àbash过程:执行/etc/profile,执行用户的.bash_profile,
执行用户的.bashrc,执行/etc/bashrc(.bashrc每个伪终端都会执行)
à.bash_logout注销(登出shell时执行)
b)
一个进程的环境包括:变量,打开的文件,目录,信号
c)
设置PATH环境变量在.bash_profile文件中,系统及的函数和别名在/etc/bashrc中设置,如PS1和PS2
d)
mesg命令可控制其他程序写终端,默认为y;stty设置tty(set tty)
e)
set –o列出shell选项;如:set –o
history打开历史记录;set +o
history关闭
f)
更多的shell选项用shopt命令,shopt –s打开,shopt –u关闭
g)
主次提示符:PS1,PS2(可以参考上面的说明)例如:大写w换小写显示全路径
h)
hash命令,见上面描述(hash –r;hash vi)
i)
source和dot命令,后者是前者的别名
j)
命令处理顺序:别名à关键字(if/while/util)à函数à内置命令à可执行体和脚本
k)
type命令查找命令的类型是内置命令还是函数或可执行体
l)
enable列出所有的内置命令
m) 退出状态:$?,unix习惯为0
n)
多条命令(ls; pwd;
date) > file1
o)
作业控制:ctrl+z调入后台,jobs显示所有作业,fg %1调入前台
p)
别名:alias ls=’ls
–colorztty’,删除别名用unalias
q)
目录栈:pushd,popd,dirs
r)
元字符:?,*,[abc],[!abc],$,;,&等,例子:
ls *; ls f{a,b,c}
s)
定义变量aaa=value或declare aaa=value
t)
显示或导出环境变量用export,(删除用unset)比较重要的环境变量:
HOME,LANG,LC_ALL,PS1,PS2,PWD,PATH等
u)
bash支持的printf如同c语言
v)
变量展开修饰符:兼容9节(bourne shell)的i小节,另外支持
{variable:offset}, {variable:offset:length}
w) 子串的变量扩展:
x)
${变量%模式} 变量尾部最小匹配,删除匹配
y)
${变量%%模式} 变量尾部最大匹配,删除匹配
z)
${变量#模式} 变量头部最小匹配,删除匹配
aa) ${变量##模式} 变量头部最大匹配,删除匹配
bb) ${#变量}
cc) 位置参量,引用:兼容bourne shell,略
dd) 算术运算:格式$[expression]或$((expression))
ee) 函数,io重定向(增加>&表示stdout和stderr),exec兼容bourne shell
ff) here文档兼容bourne
shell,set设置shell选项和shopt兼容bourne shell
gg) 内置命令大部分兼容bourne shell,enable显示所有内置命令
11. bash shell编程(2005-11-24)基本上兼容bourne shell,新支持:
[]字符串测试或文件测试,[[]]逻辑测试;其他略
12. unix常用命令:
函数
描述
at
awk
basename
bc
cal
cat
chmod
chown
clear
cmp
compress/uncompress
cp
cut
date
diff
unix比较格式
du
echo
expr
grep/egrep/fgrep
file
find
finger
fmt
fold
ftp
getopts
group
id
logname
lp/lpr
lpq
ls
mesg
mkdir
more
mv
newgrp
nice
nohup
od
pack/unpack
passwd
paste
ps
pwd
rcp
rlogin
rm
rmdir
rsh
rwho
sed
size
sleep
sort
split
split –1000 file
stty/tty
su
sum/md5sum
tail
tar
telnet
test
time
umask
uname
wc
which
whereis
who
write
13. 2005-11-24上午 深圳南山科技园