Linux文本处理命令

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版)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值