您的位置:首页 > 运维架构 > Shell

正则表达式,VI,SED及shell编程2010-12-05

2010-12-15 12:06 387 查看
一、

1、查看文件

cat

more/less

head -n 查看文件首部n行

tail -n 查看文件尾部n行

-f 不关闭文件,等待显示新增进的内容(经常用来查看处于增长阶段的日志信息)ctrl+c退出

2、正则表达式

基本正则表达式和扩展正则表达式

元字符:

.任意单个字符

[]范围内任意单个字符 如:[^abc]

*零到任意次匹配 .*

\{m\}m次 \{m,n\}m到n次 \{m,\}m到多次

锚定符:

^ 如:^root

$ 如:root$

\< 如:\<root \broot root\b \B

\> 如:root\> \<root\>

\(...\) 标记匹配到的字符,前向引用 如: love your lover

\(love\).*\1r

3、grep 全面搜索正则表达式并打印显示

egrep=grep -E

fgrep=grep -F不把任何字符当作元字符,只解释其字面意义,快速匹配

grep [options] 'pattern(模式)' file

-v 反向选取

-i

-A after-context

-B before-context

-C center-context

--color=auto (auto/never/always) export GREP_COLOR='01;32' 01背景色3前景色2绿颜色(1-7)

注:grep -E 可支持扩展正则表达式

egrep(扩展)

* 0到多次

? 0或1次

+ 1到任意次

| 或者 如:like your lover,love your lover--》l(ik)|(ov)e your lover

注:egrep 不支持\(...\)和\{m\}。但是使用{m}不需要\。支持(),表示字符组,如:l(ov){1,3}er

echo &? 可以判断上条命令执行成功与否(0 成功1 失败)

> /dev/null“胃桶” &> /dev/null 无论成功与否信息都放入“胃桶”

4、cut 剪切字段

-d 以此分段

-f 第几段

-c 如:-c2-6第2-6个字符

5、wc 统计

-l(lines)

-w(words)

-m(chars)

-c(bytes)

6、sort 排序 (缓存中保存,对原文件无影响)

-o(output)file 将排序结果保存在file中

-r 逆序

-n 以数值排序 (不指定时,以ASCII排序,如:1>2)

-f 忽略大小写

-u 去掉相连序重复行

-t 分段 -k 第几段

7、uniq 去掉相连序重复行=sort -u

-c (count)显示每行重复次数

-u (unique)只显示不重复行

-d (repeated)只显示重复行

如:cut -d: -f7 /etc/passwd | sort |grep -v "^$" | uniq

8、条件判断:

test expression #test 1 -gt 2

[expression] #[ 1-gt 2 ]

[[expression]] #[[ 1-gt 2 ]]

条件测试:

整数测试:

-gt 大于 或 (( $A > $B ))

-lt 小于

-ge 大于等于

-le 小于等于

-eq 等于

-ne 不等

字符串测试:

= != > < 以ASCII比较

-z字符串长度是否为零,为零则真

-n测试字符串是否为空,为空则假

文件测试:

-e FILE (exist)

-f (普通文件)

-d (目录)

- -r (read) -w(write) -x(可执行)

-h/L FILE 测试一个文件是否符号链接文件

-O FILE 测试此文件属主是否是自己

-G FILE 属组是否是自己所在组

组合条件测试:

-a 与

-o 或

! 非 如:[ $B -gt $A -a $B -gt $A ] [ ! $B -gt $A ]

短路操作符:&& 真真则真

|| 有真则真 如:[ $B -gt $A ] && [ $B -gt $A ]

9、diff -u 统一格式输出不同

patch -pn 把第n个/之前目录去掉 如:

/u/howard/src/blurfl/blurfl.c

-p4 后为

blurfl/blurfl.c (man patch)

diff file1 file2 比较文件

diff dir1 dir2 比较目录

patch -R 降级补丁

如:diff vimrc vimrc1 > vimrc.patch生成补丁

patch vimrc < vimrc.patch打补丁

10、aspell 词法检查

aspell check FILE

look string 查找以string开头的单词

11、tr 转换 (不改变原文件,缓存中) 如:tr 'a-z' 'A-Z'将小写字母转为大写

二、SED(stream editor流编辑器-一次处理行)非交互式编辑器,不修改原文件,在sed模式空间(缓存区)中修改,

把结果输出屏幕,可使用重定向保存结果。还支持sed脚本。

如:sed '/root/p' /etc/passwd 搜索/root并打印出来

sed -n '/root/p' /etc/passwd 只显示匹配到并处理过的内容

p 打印行

d 删除行

s g s用一个字符串替换另一个(默认只替换每行第一个)

sed 's/A/B/g' A可以使用模式,但B不能。g表示全局(globle) i 忽略大小写

1,5s 指定地址范围一至五行 1,$s 1至最后一行

如:/root/,/student/s/root/ROOT/ 从/root/行到/student/行

-i 直接修改原文件

-e 同时指定多个应用条件 如:sed -e 's/file/FILE/g' -e 's/enabled/ENABLED/g'

-f 从文件中读取条件并应用 如:sed -f sed.txt server.repo (sed.txt文件中条件不加'')

a \ 在匹配到的行下添加一行

i \ 在匹配到的行上添加一行 如:sed '/enabled=0/a \A=1\nB=2' 在enabled=0后再添两行

注:1、任何符号都可以做分隔符,如: s/ftp:\/\/com\/pub/file:\/\/\/media\/g可以写成

sAftp://com/pubAfile:///mediaAg (以A来做分隔符,但此行未出现这个字符)

2、s/r..t/R..T/g------->s/r\(..\)t/R\1T/g

3、例:s/root/rootable/g------>s/root/&able/g &用来代替/root/

三、1.nano、emacs

2.vi/vim 模式化编辑器:命令模式、输入模式、末行模式

:w /root/file

ZZ 保存退出

vim +10 file

vim +/redhat file

光标移动:h左,j下,k下,l右

行内移动:^,0,$

单词为单位:w(word),b,e(end)

行间:nG 末行模式也支持:n

句间跳转:()

段间跳转:{}

i(insert)/I a(append)/A o/O

删除组合:c$ c0 C

替换r/R

删除x/X d/D ndd

复制yy /Y

粘贴p/P

u(undo)撤销最近一次

U批量撤销

ctrl+r 撤销上一次撤销

.(redo)重做

粘最近一次操作,缓存中有最后一次

:.,+100d 删除当前行向下100行

:.,&-1d

%全文

v可视模式

V矩形模式

/pattern

?pattern n N

/\<pro[^[:space:][:punct:]]*\>

/\$[[:upper:]]\{1,\}

查找并替换:

:addr1,addr2s///gi

:%s/\<redhat\>/REDHAT/gi

例:

# fjsldfjlsdjflasjf

#fkdsj sdjfksdjf

#ljfsjflksdj

lsjdfkjsldjf #lsdjfskdjfl

sflsjdfjsdlfj

:%s/^#//g

:%s/^#//g

:%s/^[[:space:]]*#[[:space:]]*//g

:%s/^[[:space:]]*#[[:space:]]*.*$//g

:%s/^\(\([[:space:]]\)*[^[:space:]]\{1,\}\2\)#.*/\1/g

vim a b c :next :prev :first :last一次打开多个文件

vim -o a b c 一次打开多个水平窗口 :close

vim -O a b c 一次打开多个垂直窗口 :vsplit

定制vim显示特征:

set nu 编辑文件~/.vimrc set nu

set autoindent自动缩进

set ignorecase

set showmatch

四、shell算术运算:

$((expression)) 或 $[expression]

如:

$[$A+$B] $(($A+$B)) let A=$B+$C

let A=$A+$B-------> let A+=$B

+,-,\*,/,%,++,--,+=

五、流程控制语句

1、选择分支:

1)单分支

if [];then

..

fi

2)双分支:

if [];then

..

else

..

fi

3)多分支:(条件不能重叠,但可以嵌套。)

if [];then

..

elif [];then

..

elif [];then

..

else ..

fi

例:if cut -d: -f1 /etc/passwd | grep "^$1$" &> /dev/null ; then

echo "$1 is there."

else

echo "$1 is not there."

fi

2、循环分支:

while

for

until

1)for VAR in list; do

..

..

done

如:

let SUM=0

for I in $(seq 1 100); do //for I in {1,100}; do

let SUM+=$I

done

echo "The sum is: $SUM."

例:ping 教室中每个主机,成功则在线,否则不在线

-c 发几个ping包

-W 间隔时间,超时

for I in {1..254}; do

if ping -c1 -W2 192.168.0.$I &> /dev/null ; then

echo "$I is online."

else

echo "$I is offline."

fi

done

例:

cd /var

for I in ./* ; do

file $I

done

2)while []; do

...

done满足则循环,不满足则不循环

while read LINE; do

...

done < /etc/issue

cat /etc/issue|while read LINE; do

..

done

例:

let I=1

let SUM=0

while [ $I -le 100 ]; do

let SUM+=$I

let I++

done

echo "sum is $SUM."

3)until [];do 条件不满足则执行,与while相反

...

done

注:面向对象编程:顺序、选择、循环

read A B 通过输入读取并保存在变量里

例:

echo "Please input an integer:"

read A

echo "Please input an integer:"

read B

echo "The sum is $[$A+$B]."



read -p "Please input an integer:" A

read -p "Please input an integer:" B

echo "The sum is $[$A+$B]."

sleep 5 用来让循环体睡眠几秒钟后在运行

本文出自 “NEGIUP” 博客,请务必保留此出处http://negiup.blog.51cto.com/2348622/455859
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: