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

Linux运维第7天:Linux下sed工具及shell编程

2014-05-30 23:23 369 查看
sed基本用法:

    sed:stream editor

    行编辑器(全屏编辑器)

    

sed:模式空间

默认不编辑原文件,仅对模式空间中的数据做处理,处理结束后将模式空间打印到屏幕

sed [options] 'AddressCommand' file ...

    

    -n:静默模式,不再显示模式空间的内容

    -i:直接编辑原文件

    -e:同时执行多个脚本

    -f filename:脚本从文件中读取

    -r:支持扩展正则表达式

    

    Address:

        1.startline,endline : 1,200

            $倒数第一行

        2./REGEXP/

        3./PATTERN1/,/PATTERN2/:从第一个模式匹配到的行开始,至第二个模式匹配的行结束

        4.LineNumber:指定行

        5.startline,+N :总计n+1行

    

    Command:

        d:删除匹配的行

        p:显示符合条件的行

        a \"string":在后面添加 ,可以用\n换行

        i \"string":在前面添加

        r file:将指定的文件内容添加到后面

        w file:将符合条件的行保存到指定文件

        s/pattern/string/:替换,默认只替换每行中第一次匹配

            g:全局替换

            i:忽略大小写

            s///:可以使用其他如 s### s@@@

            &:引用匹配到的内容s#l..e#&r#ge  s#\(l..e\)#\1r#g

sed练习:

    1.删除/etc/grub.conf文件中行首的空白符;

    sed -r 's@^[[:spapce:]]+@@g' /etc/grub.conf

    2.替换/etc/inittab文件中"id:3:initdefault:"一行中的数字为5;

    sed 's@\(id:\)[0-9]\(:initdefault:\)@\15\2@g' /etc/inittab

    3.删除/etc/inittab文件中的空白行;

    sed '/^$/d' /etc/inittab

    4.删除/etc/inittab文件中开头的#号; 

    sed 's@^#@@g' /etc/inittab

    5.删除某文件中开头的#号及后面的空白字符,但要求#号后面必须有空白字符;

    sed -r 's@^#[[:space:]]+@@g' /etc/inittab

    6.删除某文件中以空白字符后面跟#类的行中的开头的空白字符及#

    sed -r 's@^[[:space:]]+#@@g' /etc/inittab

    7.取出一个文件路径的目录名称;

    echo "/etc/rc.d/" | sed -r 's@^(/.*/)[^/]+/?@\1@g'  

    基名:

    echo "/etc/rc.d/" | sed -r 's@^/.*/([^/]+)/?@\1@g'  

    #abc

    # hello world

       # hi world

       

练习:

传递三个参数给脚本,第一个为整数,第二个为算术运算符,第三个为整数,将计算结果显示出来,要求保留两位精度。形如:

./calc.sh 5 / 2

练习:

传递3个参数给脚本,参数均为用户名。将此些用户的帐号信息提取出来后放置于/tmp/testusers.txt文件中,并要求每一行行首有行号。

    

写一个脚本:

判断当前主机的CPU生产商,其信息在/proc/cpuinfo文件中vendor id一行中。

如果其生产商为AuthenticAMD,就显示其为AMD公司;

如果其生产商为GenuineIntel,就显示其为Intel公司;

否则,就说其为非主流公司;

写一个脚本:

给脚本传递三个整数,判断其中的最大数和最小数,并显示出来。

MAX=0

MAX -eq $1

MAX=$1

MAX -lt $2

MAX=$2

字符串测试:

    ==:

    !=:

    >

    <

    -n string:是否为不空

    -z string:是否为空

    

echo "scale=2;111/22;" | bc 

bc <<<"scale=2;111/22;"

循环:

    for

    while

    until

    

    for var in list

    do

        ...

    done

    

    生成列表

    {1..100}

    `seq [start] [step] end`

    

declare -i sum=0:整型

declare -x sum:全局变量

i++

i--

++i

--i

-=

+=

*=

/=

%=

组合测试条件

    -a: and

    -o: or 

    !: not 

___   _  _ 

A∩B = A∪B 

____   _ _ 

A∪B = A∩B

写一个脚本:

1、设定变量FILE的值为/etc/passwd

2、依次向/etc/passwd中的每个用户问好,并显示对方的shell,形如:  

    Hello, root, your shell: /bin/bash

3、统计一共有多少个用户

写一个脚本:

1、添加10个用户user1到user10,密码同用户名;但要求只有用户不存在的情况下才能添加;

扩展:

接受一个参数:

add: 添加用户user1..user10

del: 删除用户user1..user10

其它:退出

adminusers user1,user2,user3,hello,hi

写一个脚本:

计算100以内所有能被3整除的正整数的和;

取模,取余:%

3%2=1

100%55=45

写一个脚本:

计算100以内所有奇数的和以及所有偶数的和;分别显示之;

写一个脚本,分别显示当前系统上所有默认shell为bash的用户和默认shell为/sbin/nologin的用户,并统计各类shell下的用户总数。显示结果形如:

    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux bash shell编程 sed