Linux文本处理:sed与awk命令实用案例解析

需积分: 40 3 下载量 168 浏览量 更新于2024-09-12 1 收藏 44KB DOC 举报
"这篇文档提供了关于`sed`和`awk`命令在Linux或Unix环境中的使用实例,这些实例涵盖了从提取特定内容、处理文件格式、删除重复行到替换字符串等多种功能。" `sed`和`awk`是Linux/Unix环境中非常强大的文本处理工具,它们在处理日志文件、数据过滤、文本格式转换等方面发挥着重要作用。 1. `awk '/<span class="info_powerby">{p=1;next}/<\/span>/{p=0}p' login.php` 这个命令用于在`login.php`文件中打印从`<span class="info_powerby">`开始到`</span>`之间的内容。它通过设置标志变量`p`来决定是否打印当前行。 2. `sed -i 's/^M//g' login.php` 这个命令删除`login.php`文件中的所有`^M`字符(通常由Windows换行符产生)。`^M`可以通过`Ctrl+V`然后`Ctrl+M`在键盘上输入,`-i`选项用于直接在原文件上进行修改。 3. `sed -i '1!G;h;$!d' login.php` 这个命令将`login.php`文件的内容倒序。它首先跳过第一行,然后将后续行追加到之前的内容前面,直到最后一行,然后删除所有原始行。 4. `sed -e '/test/h' -e '$G' example.txt` 这个命令将`example.txt`中包含`test`的行复制到缓冲区,然后在文件末尾添加缓冲区的内容,这样每行包含`test`的行都会被附加到文件末尾。 5. `sed -e '/test/h' -e '/check/x' example.txt` 这个命令会将包含`test`的行存储到缓冲区,然后找到包含`check`的行时,用缓冲区的内容替换这一行。 6. `awk '$1=$1' urlfile` 在`urlfile`中,这个命令将每一行的第一个字段赋值给自己,这看似无操作,但实际上强迫`awk`使用默认的输出字段分隔符重新构建整行。如果新字段分隔符(OFS)已被改变,这会确保使用新OFS。 7. `dos2unix` 命令可以用来去除从Windows上传的文件中行末的^M字符,使它们适应Unix/Linux的行结束符。 8. `awk '!a[$0]++' file` 或 `sort file | uniq` 这两个命令都是用来去除文件中的重复行。`awk`方法使用一个关联数组`a`,数组的键是行内容,值是计数。第一次遇到某行时,其值递增,之后遇到则不会增加,因此只打印不重复的行。`sort`和`uniq`组合则是先排序文件,然后去除连续重复的行。 9. `sed '/aaa/{s/111/AAA/g}' urfile1` 这个命令会在`urfile1`中查找包含`aaa`的行,并将所有出现的`111`替换为`AAA`。 解答问题: 1. 在文件`a.txt`中筛选出`login_version`的值(222222222): 使用`awk`命令可以轻松完成: ```bash awk -F: '$1~/login_version/{print $2}' a.txt ``` 或者使用`sed`: ```bash sed -n 's/login_version:\(.*\)/\1/p' a.txt ``` 2. 将文件`a.txt`中`<body>hello</body>`的`hello`替换为`hi`: 如果`hello`是独立的一行,可以使用: ```bash sed -i 's/hello/hi/' a.txt ``` 如果`hello`是在`<body>`标签内,则需要使用更复杂的正则表达式来处理HTML结构,这里通常建议使用专门的HTML解析工具,如`perl`或`python`的库。由于`sed`对HTML处理能力有限,直接替换可能会导致格式错误。