Linux文本处理命令
文本编辑命令包括sed命令和awk命令,文本查找命令主要是grep命令,都支持正则表达式。sed命令是一种针对文本的流处理命令,处理单位为行,适合脚本使用。awk默认的字段分隔符号是空格或制表符,命令必须放在{}内。这两个命令通常不会修改文件的内容,只是修改输出结果。文件查找主要是find命令。文本排序主要是sort命令。
sed基本命令
① 替换
只替换第一次出现的模式,该行后面出现的不替换
sed ‘s/test/big test/’ data.txt
多个命令要加-e
sed -e ‘s/brown/green/; s/dog/cat/’ data.txt
将该行的test全部替换为trial
sed ‘s/test/trial/g’ data.txt
只作用于某些行,有行寻址和文本模式过滤器
第二行
sed ‘2s/dog/cat/’ data.txt
第二行到最后一行
sed ‘2, $s/dog/cat/’ data.txt
找到含有gzx的文本行,并替换
sed ‘/gzx/s/bash/csh/’ /etc/passwd
② 删除
删除第三行
sed ‘3d’ data.txt
删除含有文本number 1的文本行
sed ‘/number 1/d’ data.txt
③ 插入和附加文本
在第三行前插入Test line这一行,注意反斜杠分割
sed ‘3i\Test line’ data.txt
在第三行后插入Test line这一行
sed ‘3a\Test line’ data.txt
在匹配行前插入一行zzzz,注意/i表示在匹配行前插入,-i表示修改源文件。
sed -i '/应用名/izzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz' tmp.txt
④ 修改
修改第三行的内容为This is a changed line of text.
sed ‘3c\This is a changed line of text.’ data.txt
修改含有number 3文本行的内容为This is a changed line of text.
sed ‘/number 3/c\This is a changed line of text.’ data.txt
将开头的数字替换掉:
sed 's/[0-9]\{2\}\.//' /tmp/tmp.txt
⑤ 替换:全局命令
对应替换:1 -> 4 2 -> 5 3 -> 6
sed ‘y/123/456’ data.txt
将开头的数字替换掉,注意不支持+,{}要转义,参考http://fity.cn/post/338/:
sed 's/[0-9]\{2\}\.//' /tmp/tmp.txt
01.#include "stdafx.h"
02.#include "windows.h"
03.#include "stdio.h"
04.#include "conio.h"
05.
06.int main(int argc, char* argv[])
07.{
08. FILE *p;
09. LONG e_lfanew; //指向IMAGE_NT_HEADERS32结构在文件中的偏移
10. IMAGE_FILE_HEADER myfileheader;
11.
12. p = fopen("test1.exe","r+b");//自定义读取的exe文件
13. if(p == NULL)return -1;//如果打开失败就返回
14.
15. fseek(p,0x3c,SEEK_SET);//注意这里是指针偏移,也就是绕过开头的DOS区块
16. fread(&e_lfanew,4,1,p);
17. fseek(p,e_lfanew+4,SEEK_SET); //指向IMAGE_FILE_HEADER结构的偏移
18. fread(&myfileheader,sizeof(myfileheader),1,p);
19.
20. printf("IMAGE_FILE_HEADER结构:\n");
21. printf("Machine : %04X\n",myfileheader.Machine);
22. printf("NumberOfSections : %04X\n",myfileheader.NumberOfSections);
23. printf("TimeDateStamp : %08X\n",myfileheader.TimeDateStamp);
24. printf("PointerToSymbolTable : %08X\n",myfileheader.PointerToSymbolTable);
25. printf("NumberOfSymbols : %08X\n",myfileheader.NumberOfSymbols);
26. printf("SizeOfOptionalHeader : %04X\n",myfileheader.SizeOfOptionalHeader);
27. printf("Characteristics : %04X\n",myfileheader.Characteristics);
28. getch();
29. return 0;
30.}
⑥ 打印行号
打印文件当前的行号
sed ‘=’ data.txt
⑦ 文件操作
将data.txt中的第一二行写入test.txt文件中
sed ‘1,2w test.txt’ data.txt
将test.txt的内容插入到data.txt文件的第三行后面
sed ‘3r test.txt’ data.txt
从文件中读取命令
sed -f script.txt data.txt
其中script.txt的内容为:
s/brown/green/
s/fox/elephant/
s/dog/cat/
替换某个目录下的某个关键字old为new:
find . -type f -exec sed -i '' 's/old/new/g' '{}' ';'
awk基本命令
打印文件的第一个字段,$0表示整行
awk ‘{print $1}’ data.txt
指定分隔符
awk -F : ‘{print $1}’ /etc/passwd
使用多个命令,将第4个字段替换,然后输出整行
awk ‘{$4=”hello”; print $0}’ data.txt
从文件中读取命令
awk -F : -f script.txt /etc/passwd
其中script.txt的内容为:
BEGIN{
print “The latest list of users and shells”
print “UserId Shell”
print “-------- -------”
FS=”:”
}
{
print $1 “ “ $7
}
END{
print “This concludes the listing”
}
在处理数据前后运行脚本,在读入文本行前先显示标题,最后处理结束后输出内容
awk ‘BEGIN{print “The data file contents:”} {print $0} END{print “End of file”}’ data.txt
grep基本操作
在指定文件中寻找含有匹配模式的文本行。模式串最好加引号。
寻找包含bzip的文本行,注意这里文件名是shell扩展,有通配符,这个会输出文件名及匹配的文件行。
-n打印行号 -i忽略大小写,-v输出不匹配的行
grep -n -i ‘bzip’ dirlist*.txt
寻找含有bzip或者gzip的文本行
grep ‘[bg]zip’ dirlist*.txt
寻找含有zip的文本行
grep ‘^zip$’ dirlist*.txt
这里的.表示除了\n的任意字符
grep ‘.zip’ dirlist*.txt
使用扩展正则表达式时,必须加-E 选项
echo “AAA” | grep -E “AAA|BBB”
查找文本中的目录结构
grep '^[一二三四五六七八九十0-9][一、.]' write.txt
find常用操作
依据文件的各种属性在给定目录及其子目录中查找文件
统计目录个数
find ~ -type d | wc -l
查找以.jpg结尾的文件,且该文件大于1MB,加””是为了防止shell扩展
find ~ -type f -name “*.jpg” -size +1M
注意执行顺序是-type f 满足,然后”*.jpg”满足,然后1M满足,才输出。这里的*是通配符,必须完全匹配,部分包含是不行的
当没有指定具体操作时,-print是默认操作
直接删除.BAK后缀名结尾的文件,不做打印
find -type f -name “*.BAK” -delete
自定义操作,加-exec选项
注意{} ; 表示结尾,加了引号是为了防止扩展。
find ~ -type f -name ‘foo*’ -exec ls -l ‘{}’ ‘;’
只执行一次ls命令
find ~ -type f -name ‘foo*’ -exec ls -l ‘{}’ +
find ~ -type f -name ‘foo*’ -print | xargs ls -l
sort命令
对文件的文本行进行排序。默认情况下使用空格或制表符作为字段之间的界定符,并且在排序时,这些界定符是包含在字段中的。
对硬盘使用情况进行排序,取出前10个最大的空间消费者。
du -s /usr/share/* | sort -nr | head
安装文件从大到小排序,数值需要使用-n
ls -l /usr/bin | sort -nr -k 5 | head
指定:作为分割符,第7行(shell)作为排序标准
sort -t ‘:’ -k 7 /etc/passwd
参考文献:
Linux命令行大全
Linux命令行与Shell脚本编程大全(第2版)