分享
 
 
 

shell学习笔记【原创】

王朝other·作者佚名  2006-02-01
窄屏简体版  字體: |||超大  

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上午 深圳南山科技园

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有