首页 > 代码库 > 12、sed、awk、数组 学习笔记
12、sed、awk、数组 学习笔记
sed命令:
sed 选项 "地址定界编辑命令" FILE ...
选项:
-n 静默模式,不输出模式空间中的内容
-r 扩展的正则表达式
-f /path/to/script_file 指定sed脚本文件
-e ‘script‘ -e ‘script‘ 指定多个编辑指令
-i 直接编辑原文件
地址定界:
startline,endline startline到endline之间的所有行
/pat1/,/pat2/ 第一次匹配pat1到第一次匹配pat2之间的所有行
/pattern/ 所有包含pattern的行
编辑命令:
d 删除
p 打印
i \text 在匹配的行之前插入
a \text 在匹配的行之后插入
r /path/to/somefile 在指定位置把另外一个文件的内容插入进来
w /path/to/somefile 将符合条件的所有行保存至指定的文件中
= 显示符合条件的行的行号
s/// 查找条件可以使用模式,但要替换的内容不行
sed ‘地址定界s@查找条件@替换文本@‘
修饰符:
g: global,全局替换
i: ignore-case,不区分字符大小写
He like his liker.
He like his lover.
She love her liker.
She love her lover.
1、删除以上内容当中包含单词“l..e”前后一致的行;
sed ‘/\(1..e\).*\1r/d‘ sed.txt
2、将文件中“l..e”前后一致的行中,最后一个l..e词首的l换成大写L;
sed ‘s@\(\(l\(..e\)\).*\)\2@\1L\3@g‘ sed.txt
或
sed -n ‘/\(l..e\).*\1r/p‘ sed.txt | sed ‘s/l\(...r\)/L\1/g‘
练习:
1、替换/etc/inittab文件中“id:3:initdefault:”一行中的数字为5;
# sed ‘s@\(id:\)[0-9]\(:initdefault\)@\15\2@g‘ /etc/inittab
2、删除/etc/init.d/funcions文件中的空白行;
# sed ‘/^$/d‘ /etc/init.d/functions
3、删除/etc/inittab文件中位于行首的#;
# sed ‘s@^#@@g‘ /etc/inittab
4、删除/etc/rc.d/rc.sysinit文件中以#后跟至少一个空白字符开头的行的行首的#和空白字符;
# sed ‘s@^#[[:space:]]\{1,\}@@g‘ /etc/rc.d/rc.sysinit
5、删除/boot/grub/grub.conf文件中行首的空白字符;
# sed ‘s@^[[:space:]]\{1,\}@@‘ /boot/grub/grub.conf
6、取出一个文件路径的目录名称,如/etc/sysconfig/network,其目录为/etc/sysconfig,功能类似dirname命令;
# echo /etc/sysconfig/network-scripts/ifcfg-eth0/ | sed ‘s@[^/]\{1,\}/\?$@@‘
awk命令:
用法格式:awk [options] ‘/pattern/{action}‘ FILE ...
options:
-F 指定分隔符,默认为空格
pattern:
/pat1/,/pat2/ 第一次匹配pat1到第一次匹配pat2之间的所有行
/pattern/ 所有包含pattern的行
expression 表达式
>, >=, <, <=, ==, !=, ~
BEGIN 执行前的做准备工作
END 执行后的收尾工作
action:
print $1 默认为打印
awk的内置变量:
NF:字段数
awk -F" " ‘{print $NF}‘ /etc/fstab 输出最后一个字段
FS: 读入行时使用的字段分隔符,默认为空白
OFS: 输出时使用字段分隔符,默认为空白
练习:
1、显示GID小于500的组;
# awk -F : ‘$3<500{print $1}‘ /etc/group
# awk -F : ‘BEGIN{print "group name\n============="}$3<500{print $1}END{print "=============\ngroup name"}‘ /etc/group
2、显示默认shell为nologin的用户;
# awk -F : ‘$7~/nologin$/{print $1}‘ /etc/passwd
3、显示eth0网卡文件的配置信息,注意,只显示等号后面的值;
# awk -F = ‘{print $2}‘ /etc/sysconfig/network-scripts/ifcfg-eth0
4、显示/etc/sysctl.conf文件中定义的内核参数;只显示名称;
# awk -F = ‘!/^#|^$/{print $1}‘ /etc/sysctl.conf
# awk -F = ‘/^[^#]/{print $1}‘ /etc/sysctl.conf
5、显示eth0网卡的ip地址;通过ifconfig的命令结果进行过滤
# ifconfig eth0 | awk ‘/inet addr/{print $2}‘ | awk -F: ‘{print $2}‘
bash编程:数组初步
声明数组:declare -a arrayName
初始化或赋值:各元素间使用空白字符分隔
第一种:arrayName=(‘a‘ ‘b‘ ‘c‘)
第二种:arrayName=([index]=‘a‘ [index]=‘b‘)
第三种:arrayName[0]=‘a‘; arrayName[1]=‘b‘
获取数组中有效元素的个数:${#arrayName[@]}或${#arrayName[*]}
获取某一元素中字符串的长度:${#arryName[index]} (index=0,1,2...)
bash伪随机数生成器:$RANDOM
#!/bin/bash
declare -a arrayName
arrayName=(welcome to china [8]=good)
for i in `seq 0 7`;do
echo "arrarName[$i]:${arrayName[$i]},${#arrayName[$i]}"
echo $[$RANDOM%8]
done
echo "Number:${#arrayName[@]}"
本文出自 “开源殿堂” 博客,请务必保留此出处http://kaiyuandiantang.blog.51cto.com/10699754/1954889
12、sed、awk、数组 学习笔记