首页 > 代码库 > 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、数组 学习笔记