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下的用户总数。显示结果形如:
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下的用户总数。显示结果形如: