本章主要内容包括:用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是基于正则表达式来匹配文件路径的:
1 2 3 4 5 6 7 |
[root@VM_198_209_centos lsscookbook]# find . -regex ".*\(\.txt\|\.sh\)$" ./str.sh ./stty.sh ./printf.sh ./file.txt ./ifs.sh ./debug.sh |
正则表达式内容可参考之前一篇文章: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