资讯专栏INFORMATION COLUMN

Linux 常用命令用法:cat, find, xargs, tr, grep, cut, sed

Yang_River / 850人阅读

摘要:指定输出的分隔符使用,将作为文件名之间的分割符。这个命令的作用就是将的内容,作为其他命令的参数进行调用。比如结合命令命令的分隔符除了可能是之外,也可能是空格。在不指定文件名的情况下,接受作为输入源。比如上述命令应该修改为。

本文列明Linux的常用命令用法,学会了这些命令之后,结合shell编程知识,就可以做各种自动编译/集成的工作啦。
本文地址:https://segmentfault.com/a/1190000006078207

Reference

《Linux Shell 脚本攻略》
Linux中怎么找出空文件夹?

cat:显示、拼接
cat file1 file2 file3 ...

除了常有的用来显示文件内容之外,cat有两个妙用:

1. 使用 stdin 输入给 cat

xxxx | cat - output.txt

本例中使用“-”表示stdin,用xxxx命令的输出重定向给cat

2. 合并文件

cat file1 | file2 > output.txt

将两个文本合并

3. 删除多余的空白行

cat -s input.txt

4. 显示行号

cat -n input.txt
find:查找文件

基本用法:file -name "xxx"。其中可以指定文件夹,比如find /dev/ -name ...。在BSD中,目标文件夹是必须指定的。在Linux中,则可以不指定,默认是当前文件夹。
如果要求忽略大小写,则使用选项-iname。name参数后面的字符串可以使用正则表达式。

匹配多个文件

可以使用-o选项来表示“OR”,并且用“(”和“)”作为条件整体括起来。如:

find (-name "aaa.txt" -o -name "aaa.doc" )

需要注意的是,(之后和)之前必须有空格

不是匹配文件名而是匹配完整路径

-name用于匹配文件名,但是可以使用-path用来匹配路径:

find ./ -path "*/doc/*"

如果要匹配正则表达式路径,则使用-regex-iregex(忽略大小写)。此时已path而不是name方式搜寻。

指定“非”条件

可以指定“不”匹配条件,使用感叹号即可,如:

find ./ ! -name "*.txt"

限制目录深度

-maxdepth-mindepth,比如搜寻当前文件夹,则使用-maxdepth 1

按照类型权限搜索

-perm mode/+mode/-mode。其中mode是一个八进制数,对应chmod命令里面的mode。加号表示“任意一个位”,减号表示“所有1位匹配”,无符号表示“完整匹配”

过滤文件类型

find可以匹配文件类型:-type x,其中x可以是以下值:

f:file,文件

l:link,符号链接

d:directory,目录/文件夹

c:char,字符设备

b:block,块设备

s:socket

p:pipe

过滤文件时间

参数都是以下格式:-选项 天数,天数表示距离今天几天内。选项如下:

-atime:access time

-mtime:modification time

-ctime:change time(注:这个和mtime有啥区别?)
需要注意的是,UNIX中并没有“create time”的概念。

比如搜索7天内访问过的所有文件:find . -type f -atime -7
或者是访问超过7天的文件:find . -type f -atime +7
也可以是恰好7天:find . -type f -atime 7

上述参数是以天为单位的。下面几个参数以分钟为单位:
-amin, -mmin, -cmim

过滤文件大小

-size 参数
后面的参数可以用多种单位,比如c(char,字节)、kMG。比如查找大于2kB的文件:
find . -type f -size +2k

删除匹配的文件

在find命令后面加上-delete参数,find会将匹配到的文件都删除掉。这个功能很有用,但是要小心用。

对每一个文件执行操作

使用-exec对find的每一个目标进行操作,使用“{}”匹配每一个文件名。比如将所有带“configure”的文件加上执行权限:
find . -name "configure" -type f -exec chmod +x {}

说实话我觉得还不如使用xargs来得方便。

指定输出的分隔符

使用-print0,将作为文件名之间的分割符。参见xargs的使用。

查找所有空文件夹
find . -type d -empty

这是我在吧项目从svn迁移到git所遇到的问题——git不支持空文件夹啊……所以我得找到所有的空文件夹再做特殊处理。

xargs:将stdin转换为其他命令的参数并执行

有些命令可以支持stdin重定向作为输入,这是极好的。但是大部分不行。这个时候就需要使用xargs了。。
这个命令的作用就是将stdout的内容,作为其他命令的参数进行调用。基本格式是:

command | xargs ...

将stdout参数顺序输出给命令

最简单的应用是将stdout一个一个输出给命令,以换行符为单位,比如:
find -name ".svn" | xargs rm -rf
这样的结果是find输出的每一行都被执行了rm -rf ...操作。

第二种应用是指定参数个数,比如:
find -name "*.txt" | xargs -n 2 cat
使用-n参数,xargs可以每次传递指定数量的参数给command,如果参数不足,则传递剩余全部参数。

指定参数位置

使用-I参数指定一个字符串作为宏,并且在后面这个宏出现的位置中,替换成参数。在一些xargs实现中,-I参数是必需的。比如:
find -name ".svn" | xargs -I {} rm {} -rf

结合 find 命令

find命令的分隔符除了可能是" 之外,也可能是" "(空格)。为了防止错误,find应该使用-print0选项,而xargs使用-0(杠零) 选项。比如:
find -name ".svn" -print0 | xargs -0 rm -rf

tr:转换字符串,并重新输出(translate)
tr [options] set1 set2

这是一个简易的命令。tr将stdin的字符从set1的规则映射为set2规则,然后重新输出到stdout。比如将全部字母小写:...... | tr "A-Z" "a-z"
set1和set2分别是两个集合,比如"a-z", "a-z0-9", "12345"等等都是合法集合。集合中也可以使用转义字符,比如 ,
使用tr删除字符,用-d选项:...... | tr -d "0-9"
使用tr压缩连续字符(典型应用:删除连续空格):-s选项,如:...... | tr -s " "

grep:文本搜寻和匹配

多带带使用,直接指定目标文件

grep可以多带带使用,直接为其指定搜索的文件:grep "all:" Makefile
上面是在Makefile中搜索带字符“all:”的行。grep会打印出所有符合条件的
grep也可以指定多个文件,如:grep "all:" Makefile Makefile.in
grep可以指定搜索的目录。此时grep会递归艘运目录下的所有文件,如:grep "main(" ./ -r可以在当前目录下查找main函数。

使用管道

如果grep的非选项参数只有一个,那么grep会自动从stdin中获得输入。

只输出匹配文本

使用-o选项使得grep不是输出一整行,而只是指定的文本。

使用正则表达式

虽然加上-e选项可以让grep支持正则表达式,但实际上建议直接使用egrep

打印匹配的文件以及在文中的行号

使用选项-n,经常搭配-r来搜索文字。使用-Ax打印匹配目标之后的x行;使用-Bx打印匹配目标之前的 x行;使用-Cx打印前后x行。

多种匹配

使用-e来匹配多个样式,如:...... | grep -e "Linux" -e "BSD"

忽略模式的大小写

-i选项

静默模式

使用-q选项。这个模式下,grep不输出内容,只在结束的时候给出返回值。匹配成功时,返回0;失败时,返回非零值。

反匹配

使用-v做反匹配。我经常使用的一个组合命令就是:
查找我相对于svn上,修改了的文件列表:svn stat | egrep -v "^?"

打印匹配的文件名

使用-l选项,只打印匹配的文件名。

cut:文本/文件按列划分

直接上例子吧:cut -f 2,3 table.txt,这个命令表示将文件中所有第二和第三列的内容打印出来。(列数从1开始而不是0)。
  更多的情况下,我们是将它接在管道下的,有了cut命令,我们就可以很方便地去裁剪。如果没有文件参数,cut会自动从stdin中获取文本,正如grep一样。

指定界定符

如果没有指定界定符的话,cut使用默认的。一般我们要使用-d来指定,比如指定斜杠:
cut -f 2,3 -d "/" table.txt

取反

通常cut的模式是“选中”,如果加上--complement选项则变成“清除”

指定列范围

-f选项有几种写法,如下:

-f 2:指定第二列

-f 2,3,5:指定第二、三、五列

-f 2-:指定第二及以后的列

-f 2-5:指定第二至五列

-f -5:指定第一至五列

对于没有界定符的行,cut会将哪一行原原本本的输出。如果想要忽略这样的行,则使用-s选项

sed:文本替换

sed是stream editor的缩写。比如最简单的指定文本替换:sed "s/aaa/bbb" input.txt,将文件input.txt中所有的“aaa”替换成“bbb”。表达式可以用单引号或者双引号定义。
  sed在不指定文件名的情况下,接受stdin作为输入源。
  默认情况下,sed只是将替换的文本输出,使用-i保存文件,或者是使用重定向来另存为新的文件。
  默认情况下,sed只会替换每一行的第一处匹配。绝大多数情况下我们需要加上g字符来要求匹配全行所有文本。比如上述命令应该修改为:sed "s/aaa/bbb/g" input.txt。而如果是Ng则表示从第N个匹配开始替换。

定界符

sed使用几种定界符/, |, :,所以使用这些符号作为文本字符时,都需要转义。

删除

使用格式sed "/......d" file来删除匹配的格式。删除空白行的时候可以这么写:
sed "/^s*$/d" file

替换后内容的指定

匹配内容如果是正则表达式,我们事先是不知道具体的字符串是什么的。但是如果要使用匹配到的内容来操作的话,我们需却又需要这个字符串。这个时候有两种方法:
  方法一:使用&来引用匹配到的文本(因此&也是关键字)
  方法二:使用正则表达式的“捕获分组”概念,匹配到的祖父穿的分组可以在替换字符串中引用,即“1”、“2”等方式。
  注意,在sed中的用于分组的括号不能写作“()”,而是“()

替换级联

sed的替换操作可以级联起来,最直接的方法是使用管道:
sed "..." | sed "..."
第二种方法是在模式中用分号分隔(所以分号也是关键字):
sed "...;..."
第三种是使用-e选项:
sed -e "..." -e "..."

将Windows文本转换为UNIX文本

sed "s/^M//" filename > newfile
其中的“^M”不是普通字符,需要用Ctrl + V + M打出来。

脚本:对stdout的每一项进行操作

如果我们使用脚本,怎么读取一个命令输出的信息呢?如下:

for FILE in `find -iname "*.txt" -type f`
do
    ......    # 使用FILE变量操作
while

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/9401.html

相关文章

  • LinuxLinux 常用命令

    摘要:作者本文原载于,不允许转载关于命令的正则表达式使用的是不同标准的正则表达式,而且与中的正则表达式标准还不一样,真的蛋疼,详见正则表达式派别综述。 作者:LogM 本文原载于 https://segmentfault.com/u/logm/articles ,不允许转载~ 0. 关于 Linux 命令的正则表达式 awk、sed、grep 使用的是不同标准的正则表达式,而且与 C++、P...

    mzlogin 评论0 收藏0
  • Linux常用文本处理命令

    摘要:命令说明以上命令,只会对满足规则的文件进行重命名操作,而忽略了条件查找出来的文件,因此并不能满足要求,另外一定要注意命令结尾的空格和。 在使用Linux的过程中,最常做的操作就是对文件/文本进行一些处理。本文简单介绍下Linux中常用的文本处理命令,主要包括以下命令: find / grep / sort / cut / awk / sed / uniq / tee / tr / di...

    2501207950 评论0 收藏0
  • Linux常用文本处理命令

    摘要:命令说明以上命令,只会对满足规则的文件进行重命名操作,而忽略了条件查找出来的文件,因此并不能满足要求,另外一定要注意命令结尾的空格和。 在使用Linux的过程中,最常做的操作就是对文件/文本进行一些处理。本文简单介绍下Linux中常用的文本处理命令,主要包括以下命令: find / grep / sort / cut / awk / sed / uniq / tee / tr / di...

    nifhlheimr 评论0 收藏0
  • SegmentFault 技术周刊 Vol.19 - Linux 文本处理三利器

    摘要:所以,本期周刊将介绍命令行世界中最常用的文本处理命令三巨头,让它们带你初步领略命令行的强大。简单的,可以直接理解为是一个数据处理工具,倾向于将一行文本分成数个字段来处理,适合小型数据的处理。 showImg(https://sfault-image.b0.upaiyun.com/226/799/2267992322-586b7c52ed9fc); 之前看过一篇文章《当我们 chmod ...

    hightopo 评论0 收藏0
  • linux命令小书

    摘要:命令只能显示内部的命令帮助信息。指令是指令的详细内容。但使用起来要方便的多。一个只有一页,而总是将它们的内容组织成多个区段节点,每个区段也可能包含子区段子节点。工具可显示更完整的最新的工具信息。你需要更新数据库,以获得最新的文件索引信息。 linux 学习笔记 学会使用命令帮助 帮助命令 whatis command (怎么用) whereis command (它在哪 查看程序的搜...

    fjcgreat 评论0 收藏0

发表评论

0条评论

阅读需要支付1元查看
<