1 文件查看

常⽤命令作⽤
cat file1查看⽂件内容
cat -n file1查看内容并标示⾏数
cat xxx.txtawk 'NR%2==1'
tac file1从最后⼀⾏开始反看⽂件内容
more file1查看⼀个⻓⽂件的内容
less file1类似 more 命令,但允许反向操作
head -2 file1查看⽂件前两⾏
tail -2 file1查看⽂件后两⾏
tail -f /log/msg实时查看添加到⽂件中的内容

2 文本处理

常⽤命令作⽤
grep codesheep hello.txt在⽂件 hello.txt 中查找关键词 codesheep
grep ^sheep hello.txt在⽂件 hello.txt 中查找以 sheep 开头的内容
grep [0-9] hello.txt选择 hello.txt ⽂件中所有包含数字的⾏
sed ‘s/s1/s2/g’ hello.txt将 hello.txt ⽂件中的 s1 替换成 s2
sed '/^$/d' hello.txt从 hello.txt ⽂件中删除所有空⽩⾏
sed '/ * #/d ; /^$/d' hello.txt从 hello.txt ⽂件中删除所有注释和空⽩⾏
sed -e ‘1d’ hello.txt从⽂件 hello.txt 中排除第⼀⾏
sed -n ‘/s1/p’ hello.txt查看只包含关键词”s1”的⾏
sed -e 's/ *$//' hello.txt删除每⼀⾏最后的空⽩字符
sed -e ‘s/s1//g’ hello.txt从⽂档中只删除词汇 s1 并保留剩余全部
sed -n ‘1,5p;5q’ hello.txt查看从第⼀⾏到第 5 ⾏内容
sed -n ‘5p;5q’ hello.txt查看第 5 ⾏
paste file1 file2合并两个⽂件或两栏的内容
paste -d ’+’ file1 file2合并两个⽂件或两栏的内容,中间⽤”+“区分
sort file1 file2排序两个⽂件的内容
sort file1 file2uniq
sort file1 file2uniq -u
sort file1 file2uniq -d
comm -1 file1 file2⽐较两个⽂件的内容(去除’file1’所含内容)
comm -2 file1 file2⽐较两个⽂件的内容(去除’file2’所含内容)
comm -3 file1 file2⽐较两个⽂件的内容(去除两⽂件共有部分)

比如 cat 命令就可以加上

-A:显示全部内容,包括特殊字符,可列出一些特殊字符而不是空白而已;
-b:列出行号,仅针对非空白行做行号显示,空白行不标行号!
-E:将结尾的断行字符$显示出来;
-n:打印出行号,连同空白行也会有行号,与-b的选项不同:
-T:将[tab]按键以I显示出来;
-v:列出一些看不出来的特殊字符

因为在命令行是没有 Excel 这样的软件的,但是我们文本文件的表格化处理的需求是仍然存在的,所以就需要学习大量的类似于 Excel 表格功能的命令,主要是排序、提取列,计数、筛选、去冗余,查找,切割,替换,合并,补齐。

sort #排序, sort lines of text files 对文件的数据进行排序(默认根据ASCII表升序排列)
cut # 提取列,可以以列(字段)为单位处理数据
wc # 计数
grep # 筛选
uniq # 去冗余
grep # 查找
awk # 切割
tr,sed # 替换
cat, paste # 合并,补齐

初学者需要花费时间和精力来体验它们的各种参数效果。比如grep就可以进行查找和筛选,提供它这些功能的参数主要是:

-v ## 逆向匹配
-w ## 匹配上整个words
-B ## 输出匹配行之前的指定的行数 -A ## 输出匹配行之后的指定的行数 -E ## 指定支持扩展表达式
-C ## 对匹配到的行计数
-n ##输出计数后的一行
-o ## -n形式输出匹配的内容
# cut命令用于显示每行从开头算起 num1 到 num2 的文字。
$ who
rocrocket :0           2009-01-08 11:07
rocrocket pts/0        2009-01-08 11:23 (:0.0)
rocrocket pts/1        2009-01-08 14:15 (:0.0)
 
如果我们想提取每一行的第3个字节,就这样:
 
$ who|cut -b 3
c
c

3 paste 命令

paste - merge line

  1. 将一个文件所有行 merge 到一行中,用特定的分割符(默认的是?)
  2. 将两个文件按行 side-by-side merge 起来
  3. 将两个文件拼接到一起

3.1 paste 命令

paste -s file1               # 一行形式展示所有行,TAB 分隔
paste -s -d delimiter file1  # 一行形式展示所有行,自定义分隔
paste file1 file2            # side-by-side 按行展示两个文件,TAB 分割
paste -d '\n' file1 file2    # 先展示文件1,再展示文件2

3.2 awk 命令

  • 以空格为分隔符,打印文件每行第五列(也称作字段):

awk ‘{print $5}’ 文件名

  • 以空格为分隔符,打印文件包含“foo” 的所有行的第二列:

awk ‘/foo/ {print $2}’ 文件名

  • 以逗号而不是空格作为分隔符,打印文件每行的最后一列:

awk -F ’,’ ‘{print $NF}’ 文件名

  • 计算文件的第一列数值之和并打印:

awk ‘{s+=$1} END {print s}’ 文件名

  • 从第一行开始,每三行打印一行:

awk ‘NR%3==1’ 文件名

  • 根据条件不同,打印不同内容:

awk ‘{if (1 ~ “bar”) print “Partial match bar”; else print “Baz”}’ 文件名

  • 打印第 10 列等于指定值的所有行:

awk ’($10 == 指定值)’

  • 打印第 10 列介于最小值和最大值之间的所有行:

awk ‘(10 >= 最小值 && 10 最大值)‘

3.3 比较命令

cmp:这个比较命令不好用,只显示哪行不一致。

cmp test.sh test1.sh 
# test.sh test1.sh 不同:第 11 字节,第 3 行

diff:比较文件。若提供目录,则比较目录中相同文件名的文件,但是不比较子目录。

  1. 比较两个文件
  2. 忽略空白行比较两个文件
  3. 并列的方式比较两个文件
 
### diff 命令
# 比较两个文件
diff test.sh test1.sh 
# 忽略空白行
diff -b test.sh test1.sh 
diff --ignore-all-space test.sh test1.sh 
# 并列的方式比较两个文件
diff -y test.sh test1.sh 
diff --side-by-side test.sh test1.sh 
 

4 split 命令

  1. 将文件切分 10 份
  2. 将文件切分,每份 10 行
  3. 将文件切分,按照 B、KB、MB 等大小

4.1 cat 命令

  1. 打印文件 1 的内容
  2. 将文件 1 内容写入到文件 2
  3. 将文件 1 内容追加到文件 2
  4. 打印文件内容时,打印行号
  5. 清空文件 1 的内容
### cat 命令
cat tmp.txt
cat tmp.txt > tmp2.txt
cat tmp.txt >> tmp2.txt
cat -n test.sh
cat /dev/null > tmp.txt

4.2 file 命令

  1. 查看文件类型
  2. 查看文件编码
 
### file 命令
# 查看文件类型
file test.sh
# 查看文件编码
file -i test.sh
 

4.3 find

 
### find 命令
# find 语法
find [指定目录] [expression]
 
# find 文件名
find  ./  -name '*.py'              # 当前目录下,Python 文件
 
# find 文件类型(d 目录,f 文件,l 链接)
find  ./  -type  d                  # 当前目录下,所有的文件夹
 
# find 文件大小
find  ./  -size +500k -size -10M    # 500KB 到 10MB 的文件
 
# find 时间参数
# [天为单位] -mtime 被修改 | -atime 被访问 | -ctime 被状态改变
# [分钟为单位] -mmin | -amin | -cmin
find  ./  -mtime +7  -mtime -30     # 7 天前、30 天内被修改的文件
 
# find 文件所有者
find  ./  -user username
 
# find 顺带删除
find 指定目录 -daystart -mtime -7 -delete   # 查找最近 7 天修改的文件并删除
find 指定目录 -type f -empty -delete        # 查找空(0 字节)的文件并删除
find 指定目录 -type f -empty -ok rm {}\     # 查找空(0 字节)的文件并删除(删除前询问)
 
# find 后执行指令
find 指定目录 -name '*.ext' -exec wc -l {} \ # 对每个文件运行命令
 

4.4 xargs 命令

基于 pipe 执行命令

find ./ -name '*.sh' -type f | xargs cat

4.5 split 命令

  1. 将文件切分 10 份
  2. 将文件切分,每份 10 行
  3. 将文件切分,按照 B、KB、MB 等大小
split -l 10 ./test.txt  # 每份 10 行
split -n 10 ./test.txt  # 10 份文件(相同 size)
split -b 512 ./test.txt # 每份 512 bytes

4.6 tee 命令

tee 命令:从 stdin 读,写到 stdout 和文件中

tee [-ai] [文件...]
echo "example" | tee path/to/file     # 写到文件 & stdout
echo "example" | tee -a path/to/file  # 追加到文件 & stdout
## Print stdin to the terminal, and also pipe it into another program for further processing
echo "example" | tee /dev/tty | xargs printf "[%s]"
## Create a directory called "example", count the number of characters in "example" and write "example" to the terminal
echo "example" | tee >(xargs mkdir) > (wc -c)

4.7 rcp 命令

rcp:复制远程文件或目录,指令执行后,在对应目录下查看。存在对应文件则成功,反之失败。

rcp root@218.6.132.5:./testfile testfile  # 复制远程文件到本地
# -p:保留源文件或目录的属性,包括拥有者,所属群组,权限与实践
# -r:递归处理,子目录

4.8 scp 命令

scp:在服务器之间复制文件/目录。

# 从本地复制到远程_scp
local_file [remote_username@]remote_ip:remote_file
# 从远程复制到本地_scp
[remote_username@]remote_ip:remote_file local_file
# 其他参数:-q 静默;-r 目录;-P 端口
 
# 复制本地到远程
scp /home/local.txt root@192.168.1.1:/home/remote.txt
# 复制远程到本地
scp root@192.168.1.1:/local.txt /home/local_copy.txt

4.9 lndir 命令

lndir 命令用于连接目录内容。