小感一点

8月26日完善选项添加新例子

一、砖头勾引和田玉

    先说点自己对sed的目前掌控吧,sed是一个文本流编辑器,逐行处理文件。默认情况下并不直接改变原本文件内容(除非使用-i选项)。

    sed工作有两个空间pattern spaceholding space

    pattern space, sed逐行将文本行拿出,置于pattern space中,然后做相应处理,默认操作是对每一个经过pattern space的行做输出至屏幕操作(-n选择静默模式不打印pattern space中没有被打印的行,仅仅打印被匹配的行)。

    hold buffer空间,选用h操作就能将在pattern space中被匹配到的内容复制一份到hold buffer中并且覆盖原有hold buffer的记录。选用H操作就追加一行内容到hold buffer中,况且,每当使用H操作时,hold buffer默认会有一行的预留空间。选用g操作就能将holdbuffer中的内容复制到pattern space中。选用G操作就能将holdbuffer中的内容追加到patternspace中

    能用sed实现奇偶行调换,也算是对sed有了中级认识,原理就像C语言实现两个变量互换值域一样,先将要调换的拿出来,放入另一个区域中,再做操作,然后再操作初始值。

例1:用sed这样实现调换奇偶行

#sed -e '1~2{h;d;}' -e '{G}' testfile

命令流程和操作过程如下图

wKiom1XFaNCThe44AAJDCeRG8p0862.jpg

testfile文件

wKiom1XFaYeCVqmCAAG5Wkt5Ruw022.jpg

用h操作

wKioL1XFa4Ox8KghAAH-ZXomaYg354.jpg

用H操作

wKiom1XFaYeSonXZAARdWmCpOdU021.jpg

二、记录下sed的通用格式和部分选项及其command

    sed [options] '[address]|[/pattern/][actions]' FILE

        options

            -n 静默 -e 多命令模式 -f 从文件中读取sed命令

        address

            first~step 从第一行起,每两行匹配一次

            1,$

            /regexp1/,/regexp2/

        pattern /regexps/

        actions

            d p s/regexp/replacement/gi 

            a \string 在被前面pattern匹配到的行后新添加一行,内容为"string"

            i \string ...被匹配的行前新添加一行...

            c \string 将被匹配到的行内容替换为"string"

            x exchange the contents of hold and pattern spaces;

            w <filename> 将当前pattern space中的内容写到文件中

            h H Copy/Append pattern space to hold space

            g G Copy/Append hold space to pattern space

            n N Read/Append the next line of input into the pattern space

            r filename 把filename放置到匹配前面address或者pattern的后面

            q 找到地址后就退出

    s/pattern/string/[g p w i]

        此命令只替换被模式匹配到的字符本身,要是替换整行用 /pattern/c \string

        g 默认只替换第一次被模式匹配到的内容,要全局修改用g

        p 打印该变动行

        i 忽略大小写去搜索

        w filename 重定向输出该行到制定文件夹。如's///w sed.out'


三、小点仅作自己记忆参考

小点一、关于addresss

   first~step 从第一行开始,每两步匹配一次,或是说每两行执行一次后续操作,如下例,没两行执行一次{h;d},也就是说只有第一行被放入holding buffer,第二行执行默认操作(输出)。

#sed -e '1~2{h;d;}' -e '{G;}' /etc/inittab

小点二、sed的替换用于修改字符串。

   这种情况通常是比较恶心的,尤其是锚定前后字符串的,比如把/etc/inittab 中id:3:initdefault中的冒号中间的数字换成5

方法一、(&)

#sed 's/l..e/&r/g' sed.txt

方法二、(后向引用)

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


小点三、sed脚本格式

#vim script.sed
    #!/bin/sed
    #name
    #replace the first line with a "hello" 
    1 c\ hello
    
    #replace the last line with a "hello"
    $ c\ hello
    
    #add "hello" upon which "evening" been matched.
    /eventing/ i\ hello
    
    #add "hello" after 3th line.
    3 a\ hello
    
#sed -f script.sed /etc/inittab

四、各种例子,不一定都是sed

过滤出邮件地址

grep -o '[0-9a-zA-Z]\+@[0-9a-zA-Z]\+\.[a-zA-Z]' ttt.txt

打印奇数行

sed -n '1~2p' test.txt

打印偶数行有两种方法,建议第二种

sed -n '0~2p' test.txt
sed '1~2{h;d}' ./test.txt

当然也有awk的方法实现奇偶行显示

awk 'NR%2==1 {print $0}' ./test.txt
awk 'NR%2==0 {print $0}' ./test.txt

指定行后面添加空行

sed '/regexp/G' test.txt

删除空行

sed '/^$/d' test.txt

将“bar”换成“fpp”,但是只在行中未出现“and”的时候替换

sed '/and/!s/bar/fpp/g' ttt.txt

将每两行链接成一行(不是最后一行就把下一行的内容读到patternspace中并且删除掉换行符\n)

sed '$!N;s/\n//g' ttt.txt
sed '1,5N;s/\n//g' ttt.txt

删除8的倍数的行

sed '0~8d' ttt.txt

将 love改为Love

#sed 's/\(l..e\)/\1r/g' sed.txt
#sed 's/l\(..e\)/L\1/g' sed.txt

将行首的至少一个空格字符删除

#history | sed 's#^[[:space:]]+##g'

统计cpu颗数

grep 'model name' | wc -l

查找匹配到的字符串所在的行数

grep -n '^$' <filename> | awk -F: '{print $1}'

查找以空格开头的行的行号

grep -n '^[[:space:]]' <filename> | awk -F: '{print $1}'

查找有"mod"或者"med"的行,且不能包含sed

grep "mod\|med" <filename> | grep -v 'sed'

11月分内,每天6点到12点,每隔俩小时,执行一次/usr/sbin/e.sh

vim /etc/crontab
#* * * * * user-name command
* (6-12)/2 * 11 * root /usr/sbin/e.sh

下面是转载的一些命令,仅供参考

    # uname -a # 查看内核/操作系统/CPU信息
    # head -n 1 /etc/issue # 查看操作系统版本
    # cat /proc/cpuinfo # 查看CPU信息
    # hostname # 查看计算机名
    # lspci -tv # 列出所有PCI设备
    # lsusb -tv # 列出所有USB设备
    # lsmod # 列出加载的内核模块
    # env # 查看环境变量资源
    # free -m # 查看内存使用量和交换区使用量
    # df -h # 查看各分区使用情况
    # du -sh # 查看指定目录的大小
    # grep MemTotal /proc/meminfo # 查看内存总量
    # grep MemFree /proc/meminfo # 查看空闲内存量
    # uptime # 查看系统运行时间、用户数、负载
    # cat /proc/loadavg # 查看系统负载磁盘和分区
    # mount | column -t # 查看挂接的分区状态
    # fdisk -l # 查看所有分区
    # swapon -s # 查看所有交换分区
    # hdparm -i /dev/hda # 查看磁盘参数(仅适用于IDE设备)
    # dmesg | grep IDE # 查看启动时IDE设备检测状况网络
    # ifconfig # 查看所有网络接口的属性
    # iptables -L # 查看防火墙设置
    # route -n # 查看路由表
    # netstat -lntp # 查看所有监听端口
    # netstat -antp # 查看所有已经建立的连接
    # netstat -s # 查看网络统计信息进程
    # ps -ef # 查看所有进程
    # top # 实时显示进程状态用户
    # w # 查看活动用户
    # id # 查看指定用户信息
    # last # 查看用户登录日志
    # cut -d: -f1 /etc/passwd # 查看系统所有用户
    # cut -d: -f1 /etc/group # 查看系统所有组
    # crontab -l # 查看当前用户的计划任务服务
    # chkconfig –list # 列出所有系统服务
    # chkconfig –list | grep on # 列出所有启动的系统服务程序
    # rpm -qa # 查看所有安装的软件包
    # cat /proc/cpuinfo :查看CPU相关参数
    # cat /proc/partitions :查看硬盘和分区
    # cat /proc/meminfo :查看内存信息
    # cat /proc/version :查看版本,类似uname -r
    # cat /proc/ioports :查看设备io端口
    # cat /proc/interrupts :查看中断
    # cat /proc/pci :查看pci设备的信息
    # cat /proc/swaps :查看所有swap分区的信息
    # pgrep nginx : 查看所有nginx进程的pid



一点小见解,前面的关于sed引用空间的见解完全是自己摸索,但是不知道是否正确,恳请各位大牛多多指正。