导读 本文将介绍Linux下使用Shell处理文本时最常用的工具:find、grep、xargs、sort、uniq、tr、cut、paste、wc、sed、awk;提供的例子和参数都是最常用和最为实用的,我对shell脚本使用的原则是命令单行书写,尽量不要超过2行;如果有更为复杂的任务需求,还是考虑python吧!
find文件查找

查找txt和pdf文件
找txt和pdf文件

  1. find . \( -name "*.txt" -o -name "*.pdf" \) -print

正则方式查找.txt和pdf

  1. find . -iregex ".*\(\.txt|\.pdf\)___FCKpd___1quot; #-iregex:忽略大小写的正则

否定参数,查找所有非txt文本

  1. find . ! -name "*.txt" -print

指定搜索深度
打印出当前目录的文件(深度为1)

  1. find . -maxdepth 1 -type f

定制搜索
按类型搜索:
-type f文件/l符号链接

  1. find . -type d -print //只列出所有目录

按时间搜索:
-atime 访问时间 (单位是天,分钟单位则是-amin,以下类似)
-mtime 修改时间 (内容被修改)
-ctime 变化时间 (元数据或权限变化)
最近7天被访问过的所有文件:

  1. find . -atime 7 -type f -print

按大小搜索:
w字 k M G,寻找大于2k的文件

  1. find . -type f -size +2k

按权限查找:

  1. find . -type f -perm 644 -print //找具有可执行权限的所有文件

按用户查找:

  1. find . -type f -user weber -print // 找用户weber所拥有的文件

找到后的后续动作
删除当前目录下所有的swp文件:

  1. find . -type f -name "*.swp" -delete

执行动作(强大的exec)

  1. find . -type f -user root -exec chown weber {} \; //将当前目录下的所有权变更为weber

注:{}是一个特殊的字符串,对于每一个匹配的文件,{}会被替换成相应的文件名;
eg:将找到的文件全都copy到另一个目录:

  1. find . -type f -mtime +10 -name "*.txt" -exec cp {} OLD \;

结合多个命令
tips: 如果需要后续执行多个命令,可以将多个命令写成一个脚本,然后 -exec 调用时执行脚本即可;

  1. -exec ./commands.sh {} \;

-print的定界符,默认使用'\n'作为文件的定界符;
-print在每一个输出后会添加一个回车换行符,而-print0则不会,使用'\0'作为文件的定界符,这样就可以搜索包含空格的文件;
当前目录下文件从大到小排序(包括隐藏文件),文件名不为".":

  1. find . -maxdepth 1 ! -name "." -print0 | xargs -0 du -b | sort -nr | head -10 | nl
grep文本搜索

grep match_patten file // 默认访问匹配行
常用参数
-o 只输出匹配的文本行 VS -v 只输出没有匹配的文本行
-c 统计文件中包含文本的次数

  1. grep -c "text" filename

-n 打印匹配的行号
-i 搜索时忽略大小写
-l 只打印文件名
在多级目录中对文本递归搜索(程序员搜代码的最爱):

  1. grep "class" . -R -n

匹配多个模式

  1. grep -e "class" -e "vitural" file

grep输出以\0作为结尾符的文件名:(-z)

  1. grep "test" file* -lZ| xargs -0 rm
xargs命令行参数转换

xargs 能够将输入数据转化为特定命令的命令行参数;这样,可以配合很多命令来组合使用。比如grep,比如find;
将多行输出转化为单行输出

  1. cat file.txt| xargs

\n 是多行文本间的定界符 将单行转化为多行输出

  1. cat single.txt | xargs -n 3 -n:指定每行显示的字段数

xargs参数说明
-d 定义定界符 (默认为空格 多行的定界符为 \n)
-n 指定输出为多行
-I {} 指定替换字符串,这个字符串在xargs扩展时会被替换掉,用于待执行的命令需要多个参数时
eg:

  1. cat file.txt | xargs -I {} ./command.sh -p {} -1

-0:指定\0为输入定界符 eg:统计程序行数

  1. find source_dir/ -type f -name "*.cpp" -print0 |xargs -0 wc -l
sort排序

字段说明:
-n 按数字进行排序 VS
-d 按字典序进行排序
-r 逆序排序
-k N 指定按第N列排序
eg:

  1. sort -nrk 1 data.txtsort -bd data //忽略像空格之类的前导空白字符

uniq 消除重复行 消除重复行

  1. sort unsort.txt | uniq

统计各行在文件中出现的次数

  1. sort unsort.txt | uniq -c

找出重复行

  1. sort unsort.txt | uniq -d

可指定每行中需要比较的重复内容:-s开始位置 -w比较字符数

用tr进行转换

通用用法

  1. echo 12345 | tr '0-9' '9876543210' //加解密转换,替换对应字符 cat text| tr '\t' ' ' //制表符转空格

tr删除字符

  1. cat file | tr -d '0-9' // 删除所有数字

-c求补集

  1. cat file | tr -c '0-9' //获取文件中所有数字 cat file | tr -d -c '0-9 \n' //删除非数字数据

tr压缩字符
tr -s 压缩文本中出现的重复字符;最常用于压缩多余的空格

  1. cat file | tr -s ' '

字符类
tr中可用各种字符类:
alnum:字母和数字
alpha:字母
digit:数字
space:空白字符
lower:小写
upper:大写
cntrl:控制(非可打印)
字符
print:可打印字符

使用方法:tr [:class:] [:class:]

  1. eg: tr '[:lower:]' '[:upper:]'
cut按列切分文本

截取文件的第2列和第4列:

  1. cut -f2,4 filename

去文件除第3列的所有列:

  1. cut -f3 --complement filename

-d 指定定界符:

  1. cat -f2 -d";" filename

cut取的范围
N- 第N个字段到结尾
-M 第1个字段为M
N-M N到M个字段
cut取的单位
-b 以字节为单位
-c 以字符为单位
-f 以字段为单位(使用定界符)

  1. cut -c1-5 file //打印第一到5个字符 cut -c-2 file //打印前2个字符
paste按列拼接文本

将两个文本按列拼接到一起;

  1. cat file112cat file2colinbookpaste file1 file21 colin2 book

默认的定界符是制表符,可以用-d指明定界符 
paste file1 file2 -d ","
1,colin
2,book

wc统计行和字符的工具
  1. wc -l file //统计行数 
  1. wc -w file //统计单词数 
  1. wc -c file //统计字符数
sed文本替换利器

首处替换

  1. seg 's/text/replace_text/' file //替换每一行的第一处匹配的text

全局替换

  1. seg 's/text/replace_text/g' file

默认替换后,输出替换后的内容,如果需要直接替换原文件,使用-i:

  1. seg -i 's/text/repalce_text/g' file

移除空白行:

  1. sed '/^$/d' file

变量转换
已匹配的字符串通过标记&来引用.

  1. echo this is en example | seg 's/\w+/[&]/g'___FCKpd___37gt;[this] [is] [en] [example]

子串匹配标记
第一个匹配的括号内容使用标记 \1 来引用

  1. sed 's/hello\([0-9]\)/\1/'

双引号求值
sed通常用单引号来引用;也可使用双引号,使用双引号后,双引号会对表达式求值:

  1. sed 's/$var/HLLOE/'

当使用双引号时,我们可以在sed样式和替换字符串中指定变量;

  1. p=pattenr=replacedecho "line con a patten" | sed "s/$p/$r/g"___FCKpd___40gt;line con a replaced

其它示例
字符串插入字符:将文本中每行内容(PEKSHA) 转换为 PEK/SHA

  1. sed 's/^.\{3\}/&\//g' file
awk数据流处理工具

awk脚本结构

  1. awk 'BEGIN{ statements } statements2 END{ statements }'

工作方式
1.执行begin中语句块;
2.从文件或stdin中读入一行,然后执行statements2,重复这个过程,直到文件全部被读取完毕;
3.执行end语句块;
print 打印当前行
使用不带参数的print时,会打印当前行;

  1. echo -e "line1\nline2" | awk 'BEGIN{print "start"} {print } END{ print "End" }'

print 以逗号分割时,参数以空格定界;

  1. echo | awk ' {var1 = "v1" ; var2 = "V2"; var3="v3"; \print var1, var2 , var3; }'___FCKpd___43gt;v1 V2 v3

使用-拼接符的方式(""作为拼接符);

  1. echo | awk ' {var1 = "v1" ; var2 = "V2"; var3="v3"; \print var1"-"var2"-"var3; }'___FCKpd___44gt;v1-V2-v3

特殊变量:
NR NF $0 $1 $2
NR:表示记录数量,在执行过程中对应当前行号;
NF:表示字段数量,在执行过程总对应当前行的字段数;
$0:这个变量包含执行过程中当前行的文本内容;
$1:第一个字段的文本内容;
$2:第二个字段的文本内容;

  1. echo -e "line1 f2 f3\n line2 \n line 3" | awk '{print NR":"$0"-"$1"-"$2}'

打印每一行的第二和第三个字段:

  1. awk '{print $2, $3}' file

统计文件的行数:

  1. awk ' END {print NR}' file

累加每一行的第一个字段:

  1. echo -e "1\n 2\n 3\n 4\n" | awk 'BEGIN{num = 0 ; print "begin";} {sum += $1;} END {print "=="; print sum }'

传递外部变量

  1. var=1000 echo | awk '{print vara}' vara=$var # 输入来自stdinawk '{print vara}' vara=$var file # 输入来自文件

用样式对awk处理的行进行过滤 awk 'NR < 5' #行号小于5
awk 'NR==1,NR==4 {print}' file #行号等于1和4的打印出来
awk '/linux/' #包含linux文本的行(可以用正则表达式来指定,超级强大)
awk '!/linux/' #不包含linux文本的行
设置定界符
使用-F来设置定界符(默认为空格)

  1. awk -F: '{print $NF}' /etc/passwd

读取命令输出 使用getline,将外部shell命令的输出读入到变量cmdout中;

  1. echo | awk '{"grep root /etc/passwd" | getline cmdout; print cmdout }'

在awk中使用循环

  1. for(i=0;i<10;i++){print $i;}
  2. for(i in array){print array[i];}

以逆序的形式打印行:(tac命令的实现)

  1. seq 9| \awk '{lifo[NR] = $0; lno=NR} \END{ for(;lno>-1;lno--){print lifo[lno];}} '

awk实现head、tail命令

  1. head:
  2. awk 'NR< =10{print}' filename
  1. tail:
  2. awk '{buffer[NR%10] = $0;} END{for(i=0;i<11;i++){ \ print buffer[i %10]} } ' filename

打印指定列
awk方式实现:

  1. ls -lrt | awk '{print $6}'

cut方式实现

  1. ls -lrt | cut -f6

打印指定文本区域
确定行号

  1. seq 100| awk 'NR==4,NR==6{print}'

确定文本
打印处于start_pattern 和end_pattern之间的文本;

  1. awk '/start_pattern/, /end_pattern/' filename
  1. eg: seq 100 | awk '/13/,/15/'cat /etc/passwd| awk '/mai.*mail/,/news.*news/'

awk常用内建函数
index(string,search_string):返回search_string在string中出现的位置
sub(regex,replacement_str,string):将正则匹配到的第一处内容替换为replacement_str;
match(regex,string):检查正则表达式是否能够匹配字符串;
length(string):返回字符串长度

  1. echo | awk '{"grep root /etc/passwd" | getline cmdout; print length(cmdout) }'

printf 类似c语言中的printf,对输出进行格式化

  1. seq 10 | awk '{printf "->%4s\n", $1}'

迭代文件中的行、单词和字符
1. 迭代文件中的每一行
while 循环法

  1. while read line;doecho $line;done < file.txt改成子shell:cat file.txt | (while read line;do echo $line;done)

awk法:

  1. cat file.txt| awk '{print}'

2.迭代一行中的每一个单词

  1. for word in $line;do echo $word;done

3. 迭代每一个字符
${string:start_pos:num_of_chars}:从字符串中提取一个字符;(bash文本切片)
${#word}:返回变量word的长度

  1. for((i=0;i< ${#word};i++))doecho ${word:i:1);done

免费提供最新Linux技术教程书籍,为开源技术爱好者努力做得更多更好:https://www.linuxprobe.com/

Linux Shell处理文本最常用的工具大盘点的更多相关文章

  1. linux shell 修改文本 sed

    linux shell 修改文本echo [root@DSI tmp]# echo 'yhqt1 test1' > test1.txt [root@DSI tmp]# cat test1.txt ...

  2. Linux Shell的18条常用命令整理

    1.   ls: 类似于dos下的dir命令 ls最常用的参数有三个:-a -l -F. ls –a Linux上的文件以.开头的文件被系统视为隐藏文件,仅用ls命令是看不到他们的,而用ls -a除了 ...

  3. linux shell 去掉文本处理中的双引号

    cat aa.txt |sed 's/\"//g'  结果是:hello aa.txt "hello"

  4. Linux 命令行下搜索工具大盘点,效率提高不止一倍!

    在 Linux 命令行下进行文本关键字的搜索,大家肯定第一时间会想到 grep 命令.grep 命令确实十分强大,但如果需要用到它更加灵活的功能时,可能命令就会显得十分复杂. 于是,为了简化 grep ...

  5. linux命令:压缩解压打包工具大集合

    目录 (1)zip 压缩.解压缩及归档工具有很多,今天小编就整理几个大家较为常用的. compress gzip  bzip2 xz zip tar cpio 一.压缩.解压工具 用法 压缩 工具 压 ...

  6. App设计师常用的10大网页和工具大盘点

    1.Adobe Photoshop 老牌的设计工具,不用解释 2.Adobe Illustrator 同上,不解释 3.Balsamiq Mockup 网址:http://balsamiq.com/ ...

  7. Linux桌面“彩”起来:桌面环境及窗口管理器大盘点

    2011-02-22 11:49:50   看到这个标题,很多人一定认为桌面环境和窗口管理器是一回事,但严格来说窗口管理器和桌面环境是有区别的.桌面环境(Desktop Environments)是最 ...

  8. 学习笔记之Linux / Shell / QSHELL

    shell(计算机壳层)_百度百科 http://baike.baidu.com/subview/849/15831672.htm Shell (computing) - Wikipedia, the ...

  9. Linux Shell 文本处理工具集锦 zz

    内容目录: find 文件查找 grep 文本搜索 xargs 命令行参数转换 sort 排序 uniq 消除重复行 用tr进行转换 cut 按列切分文本 paste 按列拼接文本 wc 统计行和字符 ...

随机推荐

  1. event使用说明和DHTML参数属性

    event 对象 代表事件状态,如事件发生的元素,键盘状态,鼠标位置和鼠标按钮状态. DHTML元素属性列表 属性 描述 abstract 使用 event 对象获取高级流重定向器(ASX)文件中项目 ...

  2. Pipeline和FeatureUnion

    注:本文是人工智能研究网的学习笔记 Pipeline:chaining(链接)estimators Pipeline可以用于把多个estimators级联合成一个estimator.这么做的原因是考虑 ...

  3. BZOJ 3572: [Hnoi2014]世界树 虚树 树形dp

    https://www.lydsy.com/JudgeOnline/problem.php?id=3572 http://hzwer.com/6804.html 写的时候参考了hzwer的代码,不会写 ...

  4. SQL SERVER中获取表间主外键关系

    sql server 2008中的主外键关系获取方式: 转自:http://www.cnblogs.com/ke10/archive/2012/06/11/2544655.html SELECT OB ...

  5. UVA 10177 Sqr/Rects/Cubes/Boxes?

    Problem J (2/3/4)-D Sqr/Rects/Cubes/Boxes? Input: standard input Output: standard output Time Limit: ...

  6. windows控制台程序——关于UNICODE字符的总结(转)

    前言:从Windows NT/2000开如,Windows系统已经是一个标准的UNICODE系统,系统内部所有字符串存储及操作均使用UNICODE编码.因此Win32 API都是UNICODE版本的, ...

  7. Asp.net处理程序(第六篇)

    四.Web服务处理程序 对于Web服务来说,标准的方式是使用SOAP协议,在SOAP中,请求和回应的数据通过XML格式进行描述.在Asp.net 4.0下,对于Web服务来说,还可以选择支持Ajax访 ...

  8. mysql 审计插件编写

    http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=1864367&page=1#pid13527550 http://blog ...

  9. P2P通信原理与实现(C++)

    1.简介 当今互联网到处存在着一些中间件(MIddleBoxes),如NAT和防火墙,导致两个(不在同一内网)中的客户端无法直接通信.这些问题即便是到了IPV6时代也会存在,因为即使不需要NAT,但还 ...

  10. .Net高级技术——垃圾收集器

    垃圾收集器概述 大排档和学校食堂.一个是别人帮你收拾盘子,一个是自己收拾盘子. 垃圾收集GC(Garbage Collection).内存的分配.回收不需要程序员操心,程序员只要需要的时候new就可以 ...