仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1053|回复: 7
打印 上一主题 下一主题

[shell编程] 给大家带来Shell 文本处置东西集锦

[复制链接]
灵魂腐蚀 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-14 20:17:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
如果您觉得本篇CentOSLinux教程讲得好,请记得点击右边漂浮的分享程序,把好文章分享给你的好朋友们!本文将先容Linux下利用Shell处置文本时最经常使用的工具:
find、grep、xargs、sort、uniq、tr、cut、paste、wc、sed、awk;
供应的例子和参数都是最经常使用和最为有用的;
我对shell剧本利用的准绳是下令单行誊写,只管不要凌驾2行;
假如有更加庞大的义务需求,仍是思索python吧;

find文件查找


  • 查找txt和pdf文件
    1. find.(-name"*.txt"-o-name"*.pdf")-print
    复制代码
  • 正则体例查找.txt和pdf
    1. find.-regex".*(.txt|.pdf)$"
    复制代码
    -iregex:疏忽巨细写的正则
  • 否认参数
    查找一切非txt文本
    1. find.!-name"*.txt"-print
    复制代码
  • 指定搜刮深度
    打印出以后目次的文件(深度为1)
    1. find.-maxdepth1-typef
    复制代码
定制搜刮


  • 按范例搜刮:
    1. find.-typed-print//只列出一切目次
    复制代码
    -typef文件/l标记链接
  • 定时间搜刮:
    -atime会见工夫(单元是天,分钟单元则是-amin,以下相似)
    -mtime修正工夫(内容被修正)
    -ctime变更工夫(元数据或权限变更)
    比来7天被会见过的一切文件:
    1. find.-atime7-typef-print
    复制代码
  • 按巨细搜刮:
    w字kMG
    寻觅年夜于2k的文件
    1. find.-typef-size+2k
    复制代码
    按权限查找:
    1. find.-typef-perm644-print//找具有可实行权限的一切文件
    复制代码
    按用户查找:
    1. find.-typef-userweber-print//找用户weber所具有的文件
    复制代码
找到后的后续举措


  • 删除:
    删除以后目次下一切的swp文件:
    1. find.-typef-name"*.swp"-delete
    复制代码
  • 实行举措(壮大的exec)
    1. find.-regex".*(.txt|.pdf)$"0
    复制代码
    注:{}是一个特别的字符串,关于每个婚配的文件,{}会被交换成响应的文件名;
    eg:将找到的文件全都copy到另外一个目次:
    1. find.-regex".*(.txt|.pdf)$"1
    复制代码
  • 分离多个下令
    tips:假如必要后续实行多个下令,能够将多个下令写成一个剧本。然后-exec挪用时实行剧本便可;
    1. find.-regex".*(.txt|.pdf)$"2
    复制代码
-print的定界符

默许利用
作为文件的定界符;
-print0利用作为文件的定界符,如许就能够搜刮包括空格的文件;

grep文本搜刮

grepmatch_pattenfile//默许会见婚配行

  • 经常使用参数
    -o只输入婚配的文本行VS-v只输入没有婚配的文本行
    -c统计文件中包括文本的次数
    1. find.-regex".*(.txt|.pdf)$"3
    复制代码
    -n打印婚配的行号
    -i搜刮时疏忽巨细写
    -l只打印文件名
  • 在多级目次中对文本递回搜刮(步伐员搜代码的最爱):
    1. find.-regex".*(.txt|.pdf)$"4
    复制代码
  • 婚配多个形式
    1. find.-regex".*(.txt|.pdf)$"5
    复制代码

  • grep输入以作为开头符的文件名:(-z)
    1. find.-regex".*(.txt|.pdf)$"6
    复制代码

xargs下令行参数转换

xargs可以将输出数据转化为特天命令的下令行参数;如许,能够共同良多下令来组合利用。好比grep,好比find;

  • 将多行输入转化为单行输入
    catfile.txt|xargs

    是多行文本间的定界符
  • 将单行转化为多行输入
    catsingle.txt|xargs-n3
    -n:指定每行显现的字段数
xargs参数申明

-d界说定界符(默许为空格多行的定界符为

-n指定输入为多行
-I{}指定交换字符串,这个字符串在xargs扩大时会被交换失落,用于待实行的下令必要多个参数时
eg:
  1. find.-regex".*(.txt|.pdf)$"7
复制代码
-0:指定为输出定界符
eg:统计步伐行数
  1. find.-regex".*(.txt|.pdf)$"8
复制代码
sort排序

字段申明:
-n按数字举行排序VS-d按字典序举行排序
-r逆序排序
-kN指定按第N列排序
eg:
  1. find.-regex".*(.txt|.pdf)$"9
复制代码
uniq打消反复行


  • 打消反复行
    1. find.!-name"*.txt"-print0
    复制代码

  • 统计各行在文件中呈现的次数
    1. find.!-name"*.txt"-print1
    复制代码

  • 找出反复行
    1. find.!-name"*.txt"-print2
    复制代码
    可指定每行中必要对照的反复内容:-s入手下手地位-w对照字符数

用tr举行转换


  • 通用用法
    1. find.!-name"*.txt"-print3
    复制代码
  • tr删除字符
    1. find.!-name"*.txt"-print4
    复制代码
    -c求补集
    1. find.!-name"*.txt"-print5
    复制代码
  • tr紧缩字符
    tr-s紧缩文本中呈现的反复字符;最经常使用于紧缩过剩的空格
    1. find.!-name"*.txt"-print6
    复制代码
  • 字符类
    tr中可用各类字符类:
    alnum:字母和数字
    alpha:字母
    digit:数字
    space:空缺字符
    lower:小写
    upper:年夜写
    cntrl:把持(非可打印)字符
    print:可打印字符
    利用***:tr[:class:][:class:]
    1. find.!-name"*.txt"-print7
    复制代码
cut按列切分文本


  • 截取文件的第2列和第4列:
    1. find.!-name"*.txt"-print8
    复制代码

  • 往文件除第3列的一切列:
    1. find.!-name"*.txt"-print9
    复制代码

  • -d指定定界符:
    1. find.-maxdepth1-typef0
    复制代码

  • cut取的局限
    N-第N个字段到开头
    -M第1个字段为M
    N-MN到M个字段
  • cut取的单元
    -b以字节为单元
    -c以字符为单元
    -f以字段为单元(利用定界符)
  • eg:
    1. find.-maxdepth1-typef1
    复制代码

paste按列拼接文本

将两个文本按列拼接到一同;
  1. find.-maxdepth1-typef2
复制代码
默许的定界符是制表符,能够用-d指明定界符
pastefile1file2-d","
1,colin
2,book

wc统计行和字符的工具

wc-lfile//统计行数
wc-wfile//统计单词数
wc-cfile//统计字符数

sed文本交换利器


  • 首处交换
    1. find.-maxdepth1-typef3
    复制代码

  • 全局交换
    1. find.-maxdepth1-typef4
    复制代码
    默许交换后,输入交换后的内容,假如必要间接交换原文件,利用-i:
    1. find.-maxdepth1-typef5
    复制代码
  • 移除空缺行:
    1. find.-maxdepth1-typef6
    复制代码
  • 变量转换
    已婚配的字符勾通过标志&来援用.
    1. find.-maxdepth1-typef7
    复制代码
  • 子串婚配标志
    第一个婚配的括号内容利用标志1来援用
    1. find.-maxdepth1-typef8
    复制代码
  • 双引号求值
    sed一般用单引号来援用;也可以使用双引号,利用双引号后,双引号会对表达式求值:
    1. find.-maxdepth1-typef9
    复制代码
    当利用双引号时,我们能够在sed款式和交换字符串中指定变量;
    1. find.-typed-print//只列出一切目次0
    复制代码
  • 别的示例
    字符串拔出字符:将文本中每行内容(PEKSHA)转换为PEK/SHA
    1. find.-typed-print//只列出一切目次1
    复制代码
awk数据流处置工具


  • awk剧本布局
    awkBEGIN{statements}statements2END{statements}
  • 事情体例
    1.实行begin中语句块;
    2.从文件或stdin中读进一行,然后实行statements2,反复这个历程,直到文件全体被读取终了;
    3.实行end语句块;
print打印以后行


  • 利用不带参数的print时,会打印以后行;
    1. find.-typed-print//只列出一切目次2
    复制代码
  • print以逗号支解时,参数以空格定界;
    1. find.-typed-print//只列出一切目次3
    复制代码
  • 利用-拼接符的体例(""作为拼接符);
    1. find.-typed-print//只列出一切目次4
    复制代码

特别变量:NRNF$0$1$2

NR:暗示纪录数目,在实行过程当中对应该前行号;
NF:暗示字段数目,在实行历程总对应该前行的字段数;
$0:这个变量包括实行过程当中以后行的文本内容;
$1:第一个字段的文本内容;
$2:第二个字段的文本内容;
  1. find.-typed-print//只列出一切目次5
复制代码

  • 打印每行的第二和第三个字段:
    1. find.-typed-print//只列出一切目次6
    复制代码

  • 统计文件的行数:
    1. find.-typed-print//只列出一切目次7
    复制代码
  • 累加每行的第一个字段:
    1. find.-typed-print//只列出一切目次8
    复制代码
传送内部变量
  1. find.-typed-print//只列出一切目次9
复制代码
用款式对awk处置的行举行过滤

awkNR<5#行号小于5
awkNR==1,NR==4{print}file#行号即是1和4的打印出来
awk/linux/#包括linux文本的行(能够用正则表达式来指定,超等壮大)
awk!/linux/#不包括linux文本的行

设置定界符

利用-F来设置定界符(默许为空格)
awk-F:{print$NF}/etc/passwd

读取下令输入

利用getline,将内部shell下令的输入读进到变量cmdout中;
  1. find.-atime7-typef-print0
复制代码
在awk中利用轮回

for(i=0;i<10;i++){print$i;}
for(iinarray){printarray;}

eg:
以逆序的情势打印行:(tac下令的完成)
  1. find.-atime7-typef-print1
复制代码
awk完成head、tail下令


  • head:
    1. find.-atime7-typef-print2
    复制代码
  • tail:
    1. find.-atime7-typef-print3
    复制代码
打印指定列


  • awk体例完成:
    1. find.-atime7-typef-print4
    复制代码

  • cut体例完成
    1. find.-atime7-typef-print5
    复制代码

打印指定文本地区


  • 断定行号
    1. find.-atime7-typef-print6
    复制代码

  • 断定文本
    打印处于start_pattern和end_pattern之间的文本;
    1. find.-atime7-typef-print7
    复制代码
    eg:
    1. find.-atime7-typef-print8
    复制代码

awk经常使用内建函数

index(string,search_string):前往search_string在string中呈现的地位
sub(regex,replacement_str,string):将正则婚配到的第一处内容交换为replacement_str;
match(regex,string):反省正则表达式是不是可以婚配字符串;
length(string):前往字符串长度
  1. find.-atime7-typef-print9
复制代码
printf相似c言语中的printf,对输入举行格局化
eg:
  1. find.-typef-size+2k0
复制代码
迭代文件中的行、单词和字符

1.迭代文件中的每行


  • while轮回法
    1. find.-typef-size+2k1
    复制代码
  • awk法:
    catfile.txt|awk{print}
2.迭代一行中的每个单词
  1. find.-typef-size+2k2
复制代码
3.迭代每个字符

${string:start_pos:num_of_chars}:从字符串中提取一个字符;(bash文本切片)
${#word}:前往变量word的长度
  1. find.-typef-size+2k3
复制代码
本文为《linuxShell剧本攻略》的念书条记,文中次要内容和示例来自于
《linuxShell剧本攻略》;



如果您觉得本篇CentOSLinux教程讲得好,请记得点击右边漂浮的分享程序,把好文章分享给你的好朋友们!
只想知道 该用户已被删除
沙发
发表于 2015-1-15 16:04:43 | 只看该作者

给大家带来Shell 文本处置工具集锦

LZ敢整点更有创意的不?兄弟们等着围观捏~
若天明 该用户已被删除
板凳
发表于 2015-1-25 20:47:11 | 只看该作者
熟悉操作是日常学习Linux中的三大法宝。以下是作者学习Linux的一些个人经验,供参考:
小魔女 该用户已被删除
地板
发表于 2015-2-4 13:03:37 | 只看该作者
下面看看一个让人无法回答的问题:“救命各位高手,向你们请教一些问题:如何在Linux下配制HTTP、FTP、Samba、DNS、DHCP、Sendmail服务器,谢谢”这样的问题。
飘飘悠悠 该用户已被删除
5#
发表于 2015-2-9 22:54:43 | 只看该作者
写学习日记,这是学习历程的见证,同时我坚持认为是增强学习信念的法宝。
爱飞 该用户已被删除
6#
发表于 2015-2-28 08:32:21 | 只看该作者
其次,Linux简单易学,因为我们初学者只是学的基础部分,Linux的结构体系非常清晰,再加上老师循序渐进的教学以及耐心的讲解,使我们理解起来很快,短期内就基本掌握了操作和运行模式。
变相怪杰 该用户已被删除
7#
发表于 2015-3-10 02:46:48 | 只看该作者
熟读Linux系统有关知识,如系统目录树,有关内容可购书阅读或搜索论坛。
愤怒的大鸟 该用户已被删除
8#
发表于 2015-3-17 08:10:45 | 只看该作者
随着Linux技术的更加成熟、完善,其应用领域和市场份额继续快速增大。目前,其主要应用领域是服务器系统和嵌入式系统。然而,它的足迹已遍布各个行业,几乎无处不在。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-25 10:46

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表