Bonky Zhu
If someone is able to show me that what I think or do is not right, I will happily change, for I seek the truth, by which no one was ever truly harmed. It is the person who continues in his self-deception and ignorance who is harmed.

Linux常用的文件处理指令

cat 命令

基本用法

  • 显示整个文件的内容
cat filename

  • 创建一个文件
cat > filename

  • 合并文件
cat file1 file2 > file

  • 附加文件
cat > filename
cat file1 file2 > file


参数

完整的 cat指令使用方式如下

cat [-AbeEnstTuv] [--help] [--version] fileName


常用的主要有下面几个

  • -n–number 由 1 开始对所有输出的行数编号
  • -b–number-nonblank-n 相似,只不过对于空白行不编号
  • -s–squeeze-blank 当遇到有连续两行以上的空白行,就代换为一行的空白行

实验

最初的文本是这样子的

屏幕快照 2019-09-07 下午5.46.45

使用 -n 参数,然后打印结果

屏幕快照 2019-09-07 下午5.48.14

发现原文本所有的行的前面加入了一个行号,包括所有空行。

接下来我们使用 -b 参数,-b 参数的作用是给所有行行号,但不包括空白行。

image-20190907175234578

-s 参数是我平时有用的参数,可以压缩空白行,可以把多条空白行压缩为一行

image-20190907175355715

grep 命令

收先来认识下 grep 的三兄弟:grep,egrep,fgrep

grep用于简单模式和基本正则表达式(BRE); egrep可以处理扩展的正则表达式(ERE),等于 grep -Efgrep比两者都快,但只能处理固定模式,等于 grep -F。在基本正则表达式(BRE)中,只承认 ^, $, ., [, ], *这些是元字符,所有其他的字符都被识别为普通字符。而在扩展正则表达式(ERE)中,则在BRE的基础上增加了(, ), {, }, ?, +, |等元字符。

grep的作用是,给定的输入文件,搜索任何与一个或多个模式匹配的行。

基本用法

grep -l "first" *.txt


参数

grep 的用法如下

grep [-abcdDEFGHhIiJLlmnOopqRSsUVvwxZ] [-A num] [-B num] [-C[num]]
          [-e pattern] [-f file] [--binary-files=value] [--color[=when]]
          [--colour[=when]] [--context[=num]] [--label] [--line-buffered]
          [--null] [pattern] [file ...]

  • -A-B-C 选项,如果后面接数字2,A 是打印后两行,B是打印前两行,C 是打印前后两行
  • -i :一般都会加,忽略大小写
  • -n:输出行和行号
  • -v:打印不符合要求的行,即反选
  • -o:只打印符合要求的内容,而非整行。
  • --color: 给满足模式串的高亮显示
  • -l :找出内容中模式串的文件都有哪些,希望得到的是一个文件列表。而 -L 是反选

实验

文本如图所示

屏幕快照 2019-09-07 下午7.49.44

输入命令 grep -C 1 -Ei --color '(.)\1{2}' test 意思就是找到所有字符串满足三个连续,高亮并输出前后两行。这里用到了 ERE 所以用到了 -E 选项

image-20190907195313781

对于 -v 选项可以反选,输出不为模式串的行

image-20190907195756310

对于 -l-L 选项的测试结果如下

image-20190907195603751

file指令

基本用法

file -i test.py


参数

file [bcCdEhikLlNnprsvzZ0] [-e test] [-f namefile] [-F separator] [-m magicfiles] [-M magicfiles] file...

  • -b :可以使 file 命令的输出不出现文件名,只显示文件格式以及编码。
  • -i:可以输出文件的 MIME 类型字符串。
  • -F:更换分隔符 : ,写法如右:file -F "=>" poetry.txt
  • -L:查看软链接文件所指向文件的信息。
  • -f:我们通过-f选项来指定这个一个文本文件,文本里面存储了所有文件名,file 命令会根据文本中的文件名逐个查看相应文件的类型信息。例子见实验。

实验

下面是一个基本的查找

屏幕快照 2019-09-07 下午8.20.36

利用 -f 选项,我们可以查看清单里面所有的文件类型

屏幕快照 2019-09-07 下午8.35.56

tree 指令

显示指定文件夹下的树形文件结构,默认为当前文件夹屏幕快照 2019-09-07 下午9.31.02

du 指令

基础用法

  • 查看文件夹的总用量
du -sh dir

  • 查看文件夹各个文件和子文件夹大小,最后还会输出一个所有列出来文件大小总和
du -shc *

  • 查看目录下所有文件和文件夹,递归访问
du


但一般来说会加上深度参数,Linux 下是--max-depth=<num> , 而 macOS 下是-d <num>,如果深度为1的话,实际上 du -hc * 会简单些,起到了一样的作用。

屏幕快照 2019-09-07 下午9.47.02

如上图所示,du 命令只会关心文件夹,输出的都是文件夹的空间使用量,而不会关注单个文件。所以 使用 -a 选项可以让他识别到文件。

du 和 ls 的区别

在实际中,我们往往可以发现以下的情况:

屏幕快照 2019-09-07 下午9.52.15

如上图所示,duls 所显示文件的空间各不相同,这是为什么呢?

其实,duls 在展示文件大小时,是存在着本质区别的:

  • du 展示的是磁盘空间占用量。
  • ls 展示的是文件内容的大小。

与此同时,大部分文件系统规定:

  1. 一个数据块中最多存放一个文件的内容,当没存满时,剩余的空间不得被其他文件使用。
  2. 当一个文件的内容较大时,则可以存储到多个数据块中。

所以du 读取的文件最小为一个数据块的大小,这里是4K

cut 命令

基本指令

  • 获取文件某一列内容
cut -d ',' -f 1 sample.csv # 根据分隔符
cut -c 1 sample.csv # 获取第一列的字符(即每一行的开头的字符)


参数

基本用法如下

usage: cut -b list [-n] [file ...]
       cut -c list [file ...]
       cut -f list [-s] [-d delim] [file ...]

  • -b 字节数 以字节为单位进行分割。
  • -f 列号 指定提取第几列
  • -c 字符范围 不依赖分割符来分割,而是通过字符范围进行字段提取
  • -d 分隔符 按照指定的分割符进行分割

cut-b选项和-c选项在提取英文字母时效果差不多,提取中文时-b选项就不太好用了,最好使用-c选项,不然会乱码。

实践

根据分隔符获取第一列的元素的方法如下

屏幕快照 2019-09-08 上午12.09.46

然后获取每行第一个字母

屏幕快照 2019-09-08 上午12.13.42

awk 命令

更多有关 awk 的知识可以看:http://www.zsythink.net/archives/tag/awk/

还有一篇文章是对上面的一个比较精简的总结:https://blog.51cto.com/12384628/2287482

636544-20180715150312527-414617760

grepsedawk 被称为 Linux 中的 "三剑客"。

我们总结一下这三个 "剑客" 的特长。

grep 更适合单纯的查找或匹配文本

sed  更适合编辑匹配到的文本

awk  更适合格式化文本,对文本进行较复杂格式处理

基本语法

awk [options] 'Pattern{Action}' file,file1... 


下面是 awk 内置变量

变量 说明
FS 指定输入字段分隔符,默认为空白字符
OFS 指定输出字段分隔符,默认为空白字符
RS 指定换行符(输入换行符),指定输入时的换行符,默认为回车键
ORS 指定换行符(输出换行符),指定输出时的换行符,默认为回车键
NF 分割的字段数量
NR 行号
FNR 分别计数每个文件的行号
FILENAME 当前文件名
ARGV 数组
ARGC 数组的长度,即命令行参数的个数

算数函数

常用算数函数 说明
rand 产生 6 位数的随机数
srand 产生变化的 6 位随机数
int 可用于截取整数部分

字符串函数

常用字符串函数 说明
gsub 改变所有符合匹配条件的字符
sub 改变符合匹配条件的第一个字符
length 获取字符串
index 获取字符所在位置
split 分割字符串
asort 排序
asorti 函数通过下标进行排序

内置变量

内置函数 说明
$0 整行
$NF 分割后的最后一列
NF 分割后的段数
$(NF-1) 倒数第二列

还有一些条件:

de5f34115c0fa2c0b467706d5660aac2

实践

下面是一个最简单的实践

屏幕快照 2019-09-08 上午1.18.03

Share

You may also like...

发表评论