常用shell脚本命令
1、显示包含文字aaa的下一行的内容:
sed -n '/aaa/{n;p;}' filename
2、删除当前行与下一行的内容:
sed -i '/aaa/{N;d;}' filename
3、 删除当前行与下两行的内容:
sed -i '/aaa/{N;N;d;}' filename
依次类推,删除三行,则为{N;N;N;d;},分析知:N为next
4、得出以空格为分割的字符串中单词的个数,即统计个数:
awk ' { print NF } '
如显示字符串VALUE中的单词个数,其中VALUE为:aaa bbb ccc ddd ee f
则执行 echo $VALUE | awk ' { print NF } ' 后的结果为6
sed -n '/aaa/{n;p;}' filename
2、删除当前行与下一行的内容:
sed -i '/aaa/{N;d;}' filename
3、 删除当前行与下两行的内容:
sed -i '/aaa/{N;N;d;}' filename
依次类推,删除三行,则为{N;N;N;d;},分析知:N为next
4、得出以空格为分割的字符串中单词的个数,即统计个数:
awk ' { print NF } '
如显示字符串VALUE中的单词个数,其中VALUE为:aaa bbb ccc ddd ee f
则执行 echo $VALUE | awk ' { print NF } ' 后的结果为6
5、在linux中建立一个文件与另一文件的链接, 即符号链接
ln -s /var/named/chroot/f
ln -s /var/named/chroot/f
这要就建立了当前目录的文件f对/var/named/chroot/f 的符号链接。即操作f就意味着操作实际文件/var/named/chroot/f ,这时用ll命令查看的结果如:
lrwxrwxrwx 1 root root 32 Mar 22 12:f -> /var/named/chroot/f
注意:当用sed来通过f来删除一部分信息时,会将符号链接的关系丢掉,即会将f变成一个实际文件。所以 需对实际文件进行删除操作。
lrwxrwxrwx 1 root root 32 Mar 22 12:f -> /var/named/chroot/f
注意:当用sed来通过f来删除一部分信息时,会将符号链接的关系丢掉,即会将f变成一个实际文件。所以 需对实际文件进行删除操作。
6、显示指定字符范围内的内容:
如:显示文件中字符#test begin与#test end之间所有的字符
sed -n "/#test begin/,/#test end/p"
或 awk "/#test begin/,/#test end/"
在日常系统管理工作中,需要编写脚本来完成特定的功能,编写shell脚本是一个基本功了!
在编写的过程中,掌握一些常用的技巧和语法就可 以完成大部分功能了,也就是2/8原则.
1. 单引号和双引号的区别
单引号与双引号的最大不同在于双引号仍然可以引用变量的内容,但单引号内仅是普通字符 ,不会作变量的引用,直接输出字符窜。请看如下例子:
[root@linux ~]# name=HaHa
[root@linux ~]# echo $name
HaHa
[root@linux ~]# myname="$name is wow"
[root@linux ~]# echo $myname
HaHa is wow
[root@linux ~]# myname='$name is wow'
[root@linux ~]# echo $myname
$name is wow
从上面例子可以看出,使用了单引号的时候,那么$name只是普通字符,直接输出而已!
2. 逐行读取文件
∙ 使用for循环来读取文件
for line in ``
do
echo $line
done
注意:由于使用for来读入文件里的行时,会自动把空格和换行符作为一样分隔符,如果行里有空格的时候,输出的结果会很乱,所以 只适用于行连续不能有空格或者换行符的文件
∙ 使用while循环读取文件
|while read line
do
echo $line
linux循环执行命令脚本 done
或者:
while read line
do
echo $line
done <
注意:由于使用while来读入文件里的行时,会整行读入,不会关注行的内容(空格..),所以比for读文件有更好的适用性, 推荐使用while循环读取文件
3. bash shell 脚本中常用隐含变量
$0 | 当前执行的脚本或者命令名称 |
$1-$9 | 代表参数的位置. 举例 $1 代表第一个参数. |
$# | 脚本调用的参数的个数 |
$@ | 所有参数的内容 |
$* | 所有参数的内容 |
$$ | 当前运行脚本的进程号 |
$? | 命令执行后返回的状态 |
$! | 后台运行的最后一个进程号 |
注意: $? 用于检查上一个命令执行是否正确(在Linux中,命令退出状态为0表示该命令正确执行,任何非0值表示命令出错)
$$ 变量最常见的用途是用做暂存文件的名字以保证暂存文件不会重复。
$* 和 $@ 如果输出是一样的,但是在使用for循环,在使用 双引号("")引用时 "$*" 会输出成一个元素 而 "$@" 会按照每个参数是一个元素方式输出
$$ 变量最常见的用途是用做暂存文件的名字以保证暂存文件不会重复。
$* 和 $@ 如果输出是一样的,但是在使用for循环,在使用 双引号("")引用时 "$*" 会输出成一个元素 而 "$@" 会按照每个参数是一个元素方式输出
请看测试例子
#cat test.sh
#!/bin/sh
echo '"$@" '
for i in "$@"
do
echo $i
done
echo '"$*" output ....'
for i in "$*"
do
echo $i
done
输出结果
#sh test.sh a b c d
"$@"
a
b
c
d
"$*" output ....
a b c d
从输出结果可以看出 "$*" 输出是一行 而 "$@" 输出则是四行
4. 变量内容的删除与替换
我们在一些情况下,需要对变量中的字符窜进行查删除或者替换,就需要使用下表列出的方法
变量设定方式 | 说明 | |
${变量#关键字} | 若变量内容从头开始的资料符合‘关键字’,则将符合的最短资料删除 | |
${变量##关键字} | 若变量内容从头开始的资料符合‘关键字’,则将符合的最长资料删除 | |
${变量%关键字} | 若变量内容从尾向前的资料符合‘关键字’,则将符合的最短资料删除 | |
${变量%%关键字} | 若变量内容从尾向前的资料符合‘关键字’,则将符合的最长资料删除 | |
${变量/旧字串/新字串} | 若变量内容符合‘旧字串’则‘第一个旧字串会被新字串取代 | |
${变量//旧字串/新字串} | 若变量内容符合‘旧字串’则‘全部的旧字串会被新字串取代 | |
举例如下(删除字符窜中的某个字符):
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论