Shell Script常用命令-cat,find,tr

本章主要内容包括:用cat进行拼接,文件查找与文件列表,用tr进行转换,排序,分割文件和数据等等。

1.cat

(1)cat(concatence)读取文件内容的一般写法:
$ cat file1 file2…
这个命令将作为命令行参数的文件内容拼接在一起作为输出。

(2)cat不仅可以读取文件并拼接数据,还能够从标准输入中进行读取,要从标准输入中读取,就要使用管道符:
OUTPUT_FROM_SOME_COMMANDS | cat

类似地,可以用cat将输入文件的内容与标准输入拼接在一起:
$ echo “text through stdin” | cat – file.txt
其中,若没有-,将只输入file.txt中的内容。

(3)压缩空白行——选项-s

使用下面的方法压缩文本文件中连续的空白行:
$ cat -s file    #将连续多个空白行压缩至一个空白行

也可以用tr移除空白行,例如,
$ cat file.txt | tr -s ‘\n’    #将连续多个’\n’压缩成单个’\n’

(4)行号——选项-n

使用-n选项,可以显示行号:cat -n file.txt

2.文件查找与文件列表

find命令的工作方式如下:沿着文件层次结构向下遍历,匹配符合条件的文件,并执行相应的操作。

(1)要列出当前目录及子目录下所有的文件和文件夹,使用如下命令:
$ find . -print    #打印文件和目录的列表
其中 . 指定当前目录,-print指明打印出匹配文件的文件名(路径)。当使用-print是,’\n’作为分隔文件的定界符。(-print0指明了’\0’作为定界符)

(2)根据文件名匹配搜索

选项-name的参数指定了文件所必须匹配的字符串:
$ find . -name “file.txt”

选项-iname 与-name类似,只不过会忽略大小写。

匹配多个条件中的一个,可以使用or:
$ find . \( -name “*.txt” -o -name “str.sh” \)
注意,括号内两端有空格

(3)-name总是用给定文件名进行匹配。-path则将文件路径作为一个整体进行匹配:
[root@VM_198_209_centos lsscookbook]# find /home/shell/ -path “*file.txt”
/home/shell/lsscookbook/file.txt

(4)-regex是基于正则表达式来匹配文件路径的:

正则表达式内容可参考之前一篇文章:http://dulishu.top/linux-regular-expression/

(5)否定参数——!
$ find . ! -name “*.txt”

(6)基于目录深度的搜索-maxdepth, -mindepth

如果只允许find在当前目录中查找,深度可设置为1:
$ find . -maxdepth 1 -type f
当需要向下两级时,深度可以设置为2。

-mindepth与上述类似,不过它设置的是find遍历的最小深度。

(7)根据文件类型搜素——选项-type

-type可以对文件搜索进行过滤:
-type d:列出所有目录
-type f:列出所有普通文件
-type l:列出符号链接
等等…

(8)根据文件时间进行搜索——选项-atime, -mtime, -ctime

UNIX/Linux文件系统中的每一个文件都有三种时间戳:

  • 访问时间(-atime):用户最近一次访问文件的时间
  • 修改时间(-mtime):文件内容最后一次被修改的时间
  • 变换时间(-ctime):文件元数据最后一次改变的时间

这三个可以作为find的时间参数。它们可以整数值给出,单位是天。这些整数值通常还有-或+,表示小于或大于。

1)打印最近7天内被访问过的所有文件:
$ find -type f -atime -7
2)打印出恰好在第7天被访问过的文件:
$ find -type f -atime 7
3)打印出访问时间超过7天的所有文件:
$ find -type f -atime +7

上面三个都是基于天的,还有基于分钟的,对应为:-amin, -ammin, -acmin

find还有一个选项-newer,可以用来指定一个用于比较时间戳的参考文件。

(9)基于文件大小的搜索——选项-size

$ find . -type f -size +2k    #大于2KB的文件
$ find . -type f -size -2k     #小于2KB的文件
$ find . -type f -size 2k      #等于2KB的文件

除了k之外,还有以下大小单位:
b——块
c——字节
w——字(2字节)
k——千字节
M——兆字节
G——吉字节

(10)删除匹配的文件——选项-delete

-delete可以用来删除find查找到的匹配文件:

$ find . -type f -name “*.swap” -delete

(11)基于文件权限和所有权的匹配

$ find . -type f -perm 644    #打印出权限为644的文件

$ find . -type f -user leo        #打印出用户leo拥有的所有文件

(12)结合find执行命令或动作

find命令可以借助选项-exec与其他命令结合。

1)查找root的文件,修改为用户leo所有:
# find . -type f -user root -exec chown leo {} \;
其中{}是一个特殊的字符串,与-exec结合使用。对于每一个匹配的文件,{}会被替换成相应的文件名。例如find找到root所拥有的文件file.txt,其所有者会被leo替换。

2)将当前目录下C文件拼接起来写入文件all_c_files.txt
$ find . -type f -name “*.c” -exec cat {} \;>all_c_files.txt

3)将10天前的.txt文件复制到OLD目录中:
$ find . -type f -mtime +10 -name “*.txt” -exec cp {} OLD \;

3. 用tr进行转换

tr可以对来自标准输入的字符进行替换、删除以及压缩。它可以将一组字符变成另一组字符,因为通常也被称为转换(translate)命令:tr [options] set1 set2

(1)将输入字符有大写转换成小写:
$ echo “HELLO WORLD” | tr ‘A-Z’ ‘a-z’

(2)用tr进行数字加密和解密:
$ echo 12345 | tr ‘0-9’ ‘9876543210’
87654    #已加密

$ echo 87654 | tr ‘9876543210’ ‘0-9’
12345    #已解密

(3)用tr删除字符——选项-d
$ echo “Hello 123 world 456” | tr -d ‘0-9’
Hello world

(4)字符集补集——选项-c
$ echo “hello 1 char 2 next 4” | tr -d -c ‘0-9 \n’
1 2 4
这里,补集包含了除数字、空格和换行符之外的所有字符。因为指定了-d,所有这些字符都被删除。

(5)用tr压缩字符——选项-s

1)-s可以压缩输入中重复的字符:
$ echo “GNU is        not      UNIX.” | tr -s ‘ ‘
GNU is not UNIX.

2)用tr将文件中的数字列表进行相加:
$ cat sum.txt
1
2
3
4
5
$ cat sum.txt | echo $[ $(tr ‘\n’ ‘+’) 0 ]
15

其中,用’\n’替换成’+’得到“1+2+3+4+5+”,但是多了一个+,所以最后再追加一个0。$[ operation ]执行算术运算——echo $[ 1+2+3+4+5+0 ]

4. 排序、单一与重复——sort, uniq

sort命令既可以从特定的文件,也可以从stdin中获取输入,并将输出写入stdout。uniq的工作模式和sort一样。

(1)将一组文件进行排序并重定向到sorted.txt
$ sort debug.sh  ifs.sh > sorted.txt
或者
$ sort debug.sh  ifs.sh -o sorted.txt

找出已排序文件中不重复的行:
$ cat sorted.txt | uniq > unique.txt

(2)按数字进行排序
$ sort -n file.txt

(3)按逆序进行排序
$ sort -r file.txt

(4)按月份进行排序
$ sort -M months.txt

(5)合并两个排序过的文件,而且不需要对合并后的文件再进行排序:
$ sort -m sorted1.txt sorted2.txt

5. 分割文件和数据

将文件分割成多个更小的文件:
$ split -b 10k data.file

发表评论

电子邮件地址不会被公开。 必填项已用*标注