#cat httpd.conf
LoadModule access_module modules/mod_access.so
LoadModule auth_module modules/mod_auth.so
LoadModule auth_anon_module modules/mod_auth_anon.so
LoadModule auth_dbm_module modules/mod_auth_dbm.so
LoadModule auth_digest_module modules/mod_auth_digest.so
LoadModule file_cache_module modules/mod_file_cache.so
LoadModule cache_module modules/mod_cache.so
LoadModule disk_cache_module modules/mod_disk_cache.so
LoadModule mem_cache_module modules/mod_mem_cache.so
LoadModule ldap_module modules/mod_ldap.so
LoadModule auth_ldap_module modules/mod_auth_ldap.so
只输出匹配LoadModule的第一行:
#sed -n '/LoadModule/{p;q}' httpd.conf
LoadModule access_module modules/mod_access.so
只输出匹配LoadModule的最后一行:
#sed -n '/^LoadModule/h;${x;p}' httpd.conf
LoadModule auth_ldap_module modules/mod_auth_ldap.so
我想在找到最后一个匹配的字符后插入一行字符
#cat test.sh
#!/bin/bash
n=`sed -n '/^LoadModule/h;${x;p}' httpd.conf|awk '{print $2}'`
sed "/${n}/ httpd.conf This is just a test" httpd.conf
[解析]
这个要求稍微难一点,把匹配LoadModule的内容一直覆盖拷贝到缓冲空间中,注意是h,H是追加,不明白?再看看sed手册。这样sed一直读到最后一行,这时候遍历全文本只要是匹配LoadModule的内容就覆盖了缓冲空间,那肯定缓冲空间里是最后一个LoadModule行的内容,这时候x把模式空间和缓冲空间的内容交换,再打印输出即为最后一样匹配的内容了。
再附上awk的效果:
$ awk '!a[$1]++' httpd.conf
LoadModule access_module modules/mod_access.so
$ awk '/^LoadModule/{i=$0}END{print i}' httpd.conf
LoadModule auth_ldap_module modules/mod_auth_ldap.so
[解析]
如果阁下一直关注我的博客的话,聪明的您一定已经明白其中的奥秘了。
阅读(10972) | 评论(0) | 转发(0) |