共计 12063 个字符,预计需要花费 31 分钟才能阅读完成。
浏览文件
cat 查看文件内容
more 以翻页形式查看文件内容(只能向下翻页)
less 以翻页形式查看文件内容(可以上下翻页)
head 查看文件的头几行(默认 10 行)
tail 查看文件的尾几行(默认 10 行)
示例:1、查看前 10 行
$ head -n 10 test.log
2、跟踪查看最后 100 行
$ tail -f -n 100 test.log
wc
命令 wc 用于统计文件的行数、单词数、字符数等。
不带参数时默认输出一行,字段格式为:
行数 单词数 字符数 文件名
常用参数:
-l 只统计行数
-w 只统计单词数
-c 只统计字节数
-m 只统计字符数
-L 最长的一行包含了多少个字符
grep
grep (global search regular expression(RE) and print out the line, 全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。常用来在结果中搜索特定的内容。
一般格式:
grep [选项] 基本正则表达式 [文件]
选项
-c 只输出匹配行的计数
-i 不区分大小写(单字符)
-h 不显示文件名(多文件时)
-l 只输出文件名(多文件时)
-n 显示匹配行及行号
-s 不显示错误信息
-v 显示不包含匹配文本的所有行
-r 递归在子目录里文件查找
–color=auto 自动高亮找到的关键词
示例 1) 将 /etc/passwd,有出现 root 的行取出来:
$ grep ‘root’ /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
# 或者
$ cat /etc/passwd | grep ‘root’
2)将 /etc/passwd,有出现 root 的行取出来, 同时显示这些行在 /etc/passwd 的行号:
$ grep -n root /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
30:operator:x:11:0:operator:/root:/sbin/nologin
3)将 /etc/passwd,将没有出现 root 的行取出来
$ grep -v root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
4)将 /etc/passwd,将没有出现 root 和 nologin 的行取出来
$ grep -v root /etc/passwd | grep -v nologin
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
5) 查找 nginx 是否运行:
$ ps aux | grep nginx
www 1576 0.0 2.7 71652 28232 ? S Aug14 0:21 nginx: worker process
根据文件内容递归查找目录
6)在当前目录里文件查找字符串 ’math’
$ grep ‘math’ *
grep: my: Is a directory
grep: my1: Is a directory
s.txt:lisi 1989 male math 99
s.txt:wangxuebing 1978 male math 89
s.txt:lichang 1989 male math 99
7)在当前目录及其子目录下搜索 ’math’ 行的文件
$ grep -r ‘math’ *
8)当前目录及其子目录下搜索 ’math’ 行的文件,但是不显示匹配的行,只显示匹配的文件
$ grep -l -r ‘math’ *
s.txt
显示行号:
$ grep -nr ‘swoole’ –color=auto /work/www/mixphp/*
正则表达式
支持正则语法,单引号里面写正则。
正则示例:
‘t[ae]st’ #查找 test 或者 tast
‘[^g]oo’ #字符串不含有 g。注意中括号里是不包含,不是以其开头
‘[^a-z]oo’ #字符串前不包含 a - z 小写字母
‘[0-9]’ #包含数字 0 -9
‘^the’ #匹配字母 t 开始的字符
‘the$’ #匹配字母 e 结尾的字符
示例:
$ grep ‘^xu’ s.txt
xuliang 1977 male economic 89
xuxin 1986 female english 99
更多的正则知识请查看正则表达式相关知识。
扩展 grep(grep -E 或者 egrep)
使用扩展 grep 的主要好处是增加了额外的正则表达式元字符集。
示例:
查找包含 1990 和 1989 的行:
$ grep -E ‘1990|1989’ s.txt
lisi 1989 male math 99
wanglijiang 1990 female chinese 78
lichang 1989 male math 99
wanglijiang 1990 female chinese 78
lisibao 1989 male math 99
xiaobao 1990 female chinese 78
awk
awk 简介
awk 是一个强大的文本分析工具,相对于 grep 的查找,sed 的编辑,awk 在其对数据分析并生成报告时,显得尤为强大。简单来说 awk 就是把文件 (或其他方式的输入流, 如重定向输入) 逐行的读入(看作一个记录集), 把每一行看作一条记录,以空格 (或 t, 或用户自己指定的分隔符) 为默认分隔符将每行切片(类似字段),切开的部分再进行各种分析处理。
awk 有 3 个不同版本: awk、nawk 和 gawk,未作特别说明,一般指 gawk,gawk 是 AWK 的 GNU 版本。
Awk 基本语法:
awk ‘pattern1 {command1;command 2…; command 3} pattern2 {command …}’
pattern 表示用来过滤记录的模式, 可是是正则表达式,关系运算表达式,也可以什么也没有(表示选中所有记录)。
每个 pattern 选中的行记录会被花括号括起来的命令 command 操作一遍, command 之间用; 分割。花括号里面可以什么也没有, 则默认为 print 输出整行记录。Comamnd 可以是输出,可以是算术运算,逻辑运算,循环控制等等。
示例
s.txt
zhangsan 1977 male computer 83
lisi 1989 male math 99
wanglijiang 1990 female chinese 78
xuliang 1977 male economic 89
xuxin 1986 female english 99
wangxuebing 1978 male math 89
lichang 1989 male math 99
wanglijiang 1990 female chinese 78
zhangsansan 1977 male computer 83
langxuebing 1978 male math 89
lisibao 1989 male math 99
xiaobao 1990 female chinese 78
一行中的 5 个字段分别表示姓名, 出生年, 性别, 科目, 分数, 是一个很传统很典型的报表文件。
现在演示 awk 是如何查找的:
1)直接输出 1990 年出生的同学:
$ awk ‘/1990/’ s.txt
wanglijiang 1990 female chinese 78
wanglijiang 1990 female chinese 78
xiaobao 1990 female chinese 78
或者:
$ awk ‘/1990/{print $0}’ s.txt
awk 默认把输入的内容以空格拆分出每列。$0 表示匹配所有列,print $0 将输出所有列,每列分隔符是空格。
2)对 chinese 的课程的行输出 ” 语文 ”:
$ awk ‘/chinese/{print “ 语文 ”}’ s.txt
语文
语文
语文
3)记录的头部和结尾加上一段说明:
$ awk ‘BEGIN{print “Result of the quiz:\n”}{print $0}END{print “——“}’ s.txt
Result of the quiz:
zhangsan 1977 male computer 83
lisi 1989 male math 99
wanglijiang 1990 female chinese 78
xuliang 1977 male economic 89
xuxin 1986 female english 99
wangxuebing 1978 male math 89
lichang 1989 male math 99
wanglijiang 1990 female chinese 78
zhangsansan 1977 male computer 83
langxuebing 1978 male math 89
lisibao 1989 male math 99
xiaobao 1990 female chinese 78
——
AWK 工作流程:逐行扫描文件,从第一行到最后一行,寻找匹配特定模式的行,并在这些行上进行用户想要到的操作。
BEGIN 只会在最开始执行;END 只会在扫描所有行数之后执行。BEGIN 和 END 之间的花括号的内容每扫描一行都会执行。
4)查找女生的成绩且只输出姓名、学科、成绩:
$ awk ‘$3==”female”{print $1,$4,$5}’ s.txt
wanglijiang chinese 78
xuxin english 99
wanglijiang chinese 78
xiaobao chinese 78
$1 表示第 1 列,$n 类推。这里条件是表达式,而不是正则。print 里, 表示空格分隔符。
5)找出 1990 年出生的学生姓名,并要求匹配正则:
$ awk ‘$2~/1990/{print $1}’ s.txt
wanglijiang
wanglijiang
xiaobao
这里~ 表示匹配正则表达式。!~ 表示不匹配正则表达式。
如果需要多选,则改成:
$ awk ‘$2~/(1990|1991)/{print $1}’ s.txt
6) 找出大于 1985 年出生的学生姓名, 年龄,使用表达式:
$ awk ‘$2>”1985″{print $1,$2}’ s.txt
lisi 1989
wanglijiang 1990
xuxin 1986
lichang 1989
wanglijiang 1990
lisibao 1989
xiaobao 1990
awk 内置变量
awk 有许多内置变量用来设置环境信息,这些变量可以被改变,下面给出了最常用的一些变量。
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk 浏览的文件名
FNR 浏览文件的记录数
FS 设置输入列分隔符,等价于 - F 选项。默认是空格
OFS 输出列分隔符。默认是空格
NF 列的字段总数,$NF 指当前列最后一个的值
NR 已读的记录数(当前行数)
ORS 行输出分隔符,默认为 \n
RS 行输入分隔符,默认分隔符为 \n
RT 指定的那个分隔符
$0 指整条记录
$1, $2, … $n 分别是第 1,2,…n 列的字段值
示例:6)第四个字段科目为 chinese 的记录编号, 学生姓名, 科目:
$ awk ‘$4==”chinese”{print NR, $1, $4, $5}’ s.txt
3 wanglijiang chinese 78
8 wanglijiang chinese 78
12 xiaobao chinese 78
7)统计数学成绩大于 90 的个数:
$ awk ‘BEGIN{goodMath=0;}($4==”math” && $5>90){goodMath++}END{print goodMath}’ s.txt
3
8)更换输入换行符
echo “11 22|12 23″ | awk ‘BEGIN{RS=”|”}{print $0}’
等价于:
echo “11 22|12 23” | awk -v RS=’|’ ‘{print $0}’
输出:
11 22
12 23
注:文本内容(例如 ”11 22n12 23″)里的 \n 不是换行符,实际是 \\n。shell 里字符串的 \n 要生效,需要使用 echo -e。示例:echo -e “11 22\n12 23” | awk ‘{print $0}’。
9)更换列输入、输出分隔符:
$ cat /etc/passwd |awk -F ‘:’ -v OFS=’\t’ ‘{print $1}’
root
daemon
bin
sys
- F 指定输入域分隔符为:。- F 等价于 -v FS。-v OFS 指定输出域分隔符为 \t。
注:- F 和 -v OFS 在处理 MySQL 数据导出导入时有非常大的作用:我们可以使用 - F 指定每列是以 \t 或者,(csv 格式)分隔的;输出的时候我们可以用 -v OFS 指定每列分隔符,默认的空格经常不足以方便使用。如果使用了 -v OFS,使用 print $0 是改变不了输出分隔符的,需要手动指定列,例如 print $1,$2。
10)批量操作
# docker 里关闭所有正在运行容器
docker ps | awk ‘{print $1}’ | xargs docker stop
# docker 里删除所有容器应用
docker ps -a | awk ‘{print $1}’ | xargs docker rm
11)文件切割
awk ‘{filename = “sub.” int((NR-1)/5000) “.csv”; print >> filename}’ history.csv
每 5W 行切割为一个文件。
12)分组合并
例如 test.txt 文本内容是:
yjc 1 20170118
yjc 1 20170118
lisi 1 20170223
需要整理成(姓名、日期相同的计数累加):
yjc 2 20170118
lisi 1 20170223
脚本:
cat test.txt | awk ‘{a[$1$3][“c”]+=$2;a[$1$3][“u”]=$1;a[$1$3][“d”]=$3;}END{for(i in a)print a[i][“u”],a[i][“c”],a[i][“d”]}’
awk 函数
awk 还支持内置函数。这里只列举部分。
int(x) 返回 x 的截断至整数的值
rand() 返回任意数字 n,其中 0 <= n < 1。
sqrt(x) 返回 x 平方根。
sub(Ere, Repl, [In]) 字符串替换
gsub(Ere, Repl, [In]) 正则替换
index(str, str2) str2 在 str 中出现的位置,从 1 开始编号。不存在返回 0
substr(str, M, [N]) 返回具有 N 参数指定的字符数量子串。如果未指定 N 参数,则子串的长度将是 M 参数指定的位置到 str 参数的末尾的长度。
length [(str)] 返回 str 参数指定的字符串的长度(字符形式)。如果未给出 str 参数,则返回整个记录的长度($0 记录变量)。
match(str, Ere) 返回 Ere 匹配的字符串在 str 中出现的位置,从 1 开始编号。不匹配返回 -1
tolower(str) 字符串转小写
toupper(str) 字符串转大写
split(str, A, [Ere] ) 将 str 参数指定的参数分割为数组元素 A[1], A[2], . . ., A[n],并返回 n 变量的值。分隔符由正则表达式 Ere 匹配得出。
mktime(YYYY MM DD HH MM SS[DST]) 根据日期生成时间戳。失败返回 -1
strftime([format [, timestamp]]) 格式化时间输出,将时间戳转为时间字符串
systime() 得到时间戳
13) int 函数
$ echo “10.22 元 ” | awk ‘{$1=int($1);print $1}’
10
如果只是想转换为数字,可以使用乘法运算:
$ echo “10.22 元 ” | awk ‘{$1=$1*1;print $1}’
10.22
14) 数学函数
$ echo 9 | awk ‘{$1=sqrt($1);print $1}’
3
15) 字符串函数
$ awk ‘BEGIN{info=”test2010test”;gsub(“2010″,” “,info);print info}’
test test
$ awk ‘BEGIN{info=”test2010test”;gsub(/[0-9]+/,” “,info);print info}’
test test
$ awk ‘BEGIN{info=”test2010test”;print index(info, 2010);}’
5
$ awk ‘BEGIN{info=”test2010test”;print substr(info, 5);}’
2010test
$ awk ‘BEGIN{info=”test2010test”;print length(info);}’
12
$ awk ‘BEGIN{info=”test2010test”;print toupper(info);}’
TEST2010TEST
$ awk ‘BEGIN{info=”test2010test”;print match(info, /[0-9]+/);}’
5
$ echo “10:20″ | awk ‘{split($1,arr,”:”);print arr[1];print arr[1];print arr[1]*60+arr[2];}’
10
10
620
$ awk ‘BEGIN{info=”hello shell”;split(info,arr,” “);print length(arr);for(k in arr){print
k,arr[k];}}’
2
1 hello
2 shell
awk for …in 循环,是一个无序的循环。并不是从数组下标 1…n,因此使用时候需要注意。split 生成的数组下标从 1 开始。
16) 时间戳函数
$ awk ‘BEGIN{print systime();}’
1543668202
$ awk ‘BEGIN{print strftime(“%Y-%m-%d %H:%M:%S”,1543668202);}’
2018-12-01 20:43:22
$ awk ‘BEGIN{print mktime(“2018 12 01 20 43 22″);}’
1543668202
$ awk ‘BEGIN{$1=”2018-12-20″;gsub(/[-:]/,” “,$1);print mktime($1.” 20 43 22″);}’
1545309802
printf 格式化
格式和 C 语言的一样。支持 %d %s %u %f %c %o %x 等。
格式符
说明
%d
十进制有符号整数
%u
十进制无符号整数
%f
浮点数
%s
字符串
%c
单个字符
%p
指针的值
%e
指数形式的浮点数
%x
%X 无符号以十六进制表示的整数
%o
无符号以八进制表示的整数
%g
自动选择合适的表示法
$ awk ‘BEGIN{x=12.12; printf(“%.2f,%.2u,%d,%s,%o\n”,x,x,x,x,x);}’
12.12,12,12,12.12,14
其它详见:https://www.cnblogs.com/cheng…
17) if…else 示例: 将下列文件格式转换为新的格式:原格式:route.csv
// 测试
‘/api/user/info’ => ‘User::getUserInfo’,
‘/api/user/info_batch’ => ‘User::getUserInfoBatch’, // 批量获取
新格式:route2.csv
// 测试
‘/api/user/info’ => [“route” => ‘User::getUserInfo’, “tag” => ‘user’],
‘/api/user/info_batch’ => [“route” => ‘User::getUserInfoBatch’, “tag” => ‘user’], // 批量获取
脚本:
cat route.csv | awk -F ‘=>’ -v OFS=’\t’ ‘{print $1,$2}’ | awk -F ‘,’ -v OFS=’\t’ ‘{print $1,$2}’ | awk -F ‘\t’ ‘{if($2>””) print $1, ” => [\”route\” => “$2″, \”tag\” => “user”], “$3; else print $1 }’ >> route2.csv
sed
和 grep、awk 不同,sed 更侧重对搜索文本的处理,如修改、删除、替换等等。
sed 工作原理:sed 会一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,成为 ” 模式空间 ”,接着用 sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
语法
sed [options] ‘command’ file(s)
sed [options] -f scriptfile file(s)
参数说明:
-n, –quiet, –silent 安静模式,也就是不会输出默认打印信息
-e <script>, –expression=<script> 以选项中指定的 script 来处理输入的文本文件,可以多条
-i 直接编辑文件而不是显示在屏幕上
-f <script 文件 >, –file=<script 文件 > 以选项中指定的 script 文件来处理输入的文本文件。
-h, –help 显示帮助。
-V, –version 显示版本信息。
动作说明:
a 表示在指定行下边插入指定行的内容。
i 命令 i 和 a 使用上基本上一样,只不过是在指定行上边插入指定行的内容。
d 表示删除指定的行内容
c c 是表示把指定的行内容替换为自己需要的行内容。注意是整行替换
y 字符替换,可以替换多个字符,只能替换字符不能替换字符串,且不支持正则表达式
s 字符串替换,是平时 sed 使用的最多的子命令。支持正则表达式
r 类似于 a,也是将内容追加到指定行的后边,只不过 r 是将指定文件内容读取并追加到指定行下边。
sed 命令必须跟一个动作。
新建文件 t.txt:
zhangsan 1977 male computer 83
lisi 1989 male math 99
wanglijiang 1990 female chinese 78
1)新增一行:第 3 行后新增:
$ sed -e ‘3a newline’
zhangsan 1977 male computer 83
lisi 1989 male math 99
wanglijiang 1990 female chinese 78
newline
2)插入一行:第 3 行前插入:
$ sed -e ‘3i newline’
zhangsan 1977 male computer 83
lisi 1989 male math 99
newline
wanglijiang 1990 female chinese 78
3)删除一行:删除第 3 行:
$ sed -e ‘3d’
zhangsan 1977 male computer 83
lisi 1989 male math 99
4)替换一行:
$ sed -e ‘3c newline’
zhangsan 1977 male computer 83
lisi 1989 male math 99
newline
5)行内部分内容的替换:格式:
sed ‘s/ 要被取代的字串 / 新的字串 /g’
示例:
$ sed ‘3s/1990/2000/g’ t.log
zhangsan 1977 male computer 83
lisi 1989 male math 99
wanglijiang 2000 female chinese 78
一些替换规则范例:
s/\t/”,”/g; \t 换成 ”,”
s/^/”/; 开头加上 ”
s/$/”/;s/\n//g 末尾加上 ”
s/”//g; 引号去掉
s/,/ /g 逗号换成空格
s/,/\n/g 逗号换成空行
s/[NULL]//g; NULL 换成空白
s/[,,]/\n/g 中英文逗号换成空行
6)多行操作:
$ sed ‘2,3d’ t.log #删除 2,3 行
$ sed ‘2,$d’ t.log #从第 2 行开始删除到末尾
$ sed ‘2,3a test’ t.log #分别在第 2 行,第 3 行增加字符 ”test”
7)r 命令
sed ‘2r t.log’ message
将 a.txt 文件内容读取并插入到 t1.log 文件第 2 行的下边。
注意:1、上述的操作均只在输出缓冲里操作,文件并没有变化;需要直接修改文件,前面加 - i 参数;2、- e 参数可以没有。
xargs
之所以能用到这个命令,关键是由于很多命令不支持 | 管道来传递参数,而日常工作中有有这个必要,所以就有了 xargs 命令,例如:
find /sbin -perm +700 | ls -l #这个命令是错误的
find /sbin -perm +700 | xargs ls -l #这样才是正确的
sort
排序,默认按照字符升序排序。
-r, –reverse 逆向(倒序)排序
-n, –numeric-sort 基于数字排序
-d, –dictionary-order 字典序
-h, –human-numeric-sort 按照人类可识别的顺序,例如(1G>1M>1K)
-f, –ignore-case 忽略大小写
-u, –unique 去重复(剔除重复行)
-t, –field-separator=SEP 指定分隔符(一般配合 - k 参数使用,单纯分割毫无意义)
-k, –key=POS1[,POS2] 当指定分割符时,按照第 n 个字段进行排序(序号 n 从 1 开始)
以下面的内容为例:
$ cat 1.txt
456
456
123
11
34
5678
456
按字符降序:
sort -r 1.txt
5678
456
456
456
34
123
11
按数值降序:
# sort -rn 1.txt
5678
456
456
456
123
34
11
去除重复行:
$ sort -nu 1.txt
11
34
123
456
5678
- h 这个一般可以用来排序文件大小:
$ du -h
2.0G ./test2
4.0K ./test3
316M ./test
2.3G .
$ du -h |sort -hr
2.3G .
2.0G ./test2
316M ./test
4.0K ./test3
-t,- k 适用于多列的情况:
$ cat 2.txt
baidu,100,5000
google,110,5000
sohu,100,4500
guge,50,3000
分别表示公司、员工数、最低工资。我们先按照员工数升序,如果员工数相同,按照最低工资升序:
$ sort -n -t ‘,’ -k 2 -k 3 2.txt
guge,50,3000
sohu,100,4500
baidu,100,5000
google,110,5000
按照员工工资降序排序,如果员工人数相同的,则按照公司人数升序排序:
# sort -t ‘,’ -k 3nr -k 2n 2.txt
baidu,100,5000
google,110,5000
sohu,100,4500
guge,50,3000
uniq
用于去重,需要先执行 sort。
-c: 显示文件中行重复的次数
-d: 只显示重复的行(相邻的行)
-D: 把所有重复的行都显示出来(相邻的行)
示例:
# 排序后去重
$ sort 1.txt |uniq
11
123
34
456
5678
# 显示重复次数
$ sort 1.txt | uniq -c
1 11
1 123
1 34
3 456
1 5678
# 仅显示重复的内容
$ sort 1.txt | uniq -d
456
# 显示所有重复的行内容
$ sort 1.txt | uniq -D
456
456
456
注:uniq 仅针对换行符是 \n,对于 windows 下编写的文件如果换行符是 \r\n 则无法排序。
rsync
rsync(remote sync) 是用于同步某一位置文件和目录到另一位置的有效方法。备份的位置可以在本地服务器或远程服务器。
rsync [OPTION]… SRC [SRC]… DEST
示例:将 Jenkins 编译生成的文件同步到远程服务器,排除 git 目录:
rsync -azP –exclude .git /var/lib/jenkins/workspace/myapi/output/ root@172.17.17.10:/alidata/myapi/
参数:
–z:允许压缩
–v:冗长
–r:递归
–a:递归模式,同步软链接,同步权限,同步时间戳,同步属主和属组
与 scp 的区别:
1、对于 scp 来说,除了在机器之间和一个机器目录之间进行数据同步之外,还可以在两台不同机器之间进行数据同步。比如你在 A 机器,可以对 B、C 两台机器上的数据进行同步,但是 rsync 就不可以;也就是说当 rsync 进行跨机器同步数据的时候只可以在本机与另外一台机器之间进行数据的同步。2、rsync 是为了在两个机器之间进行数据的同步,既然有了 scp 为何还要有这个协议呢?该协议主要目的是在两台机器之间进行数据同步的时候,尽量少的传递数据。rsync 可以聪明的在两台机器之间进行数据的同步,并通过合适的差分编码减少数据的传输。rsync 的作用就是当要同步数据的对端已经存在部分要同步数据的情况下,通过使用 rsync 可以只传递对端没有的数据。假设一个文件 100G,在文件末尾只加了一个句号。这时候要同步数据,如果使用 scp 那么要拷贝传输 100G 数据过去,而 rsync 只传输修改后的数据,整个任务就结束了。
参考
1、linux awk 命令详解 – ggjucheng – 博客园 http://www.cnblogs.com/ggjuch… 2、sed 入门详解教程 – 肖邦 linux – 博客园 https://www.cnblogs.com/liwei… 3、Linux 入门记录:十七、Linux 命令行文本 / 文件处理工具 – mingc – 博客园 https://www.cnblogs.com/mingc… 4、linux sort 命令详解 – 孙愚 – 博客园 https://www.cnblogs.com/51lin… 5、OFS- 输出字段分隔符 | awk https://lvs071103.gitbooks.io… 6、Awk 关系运算符和布尔运算符 – 自由的代价永远是警惕 – CSDN 博客 https://blog.csdn.net/liu4546… 7、linux awk 内置函数详细介绍(实例)– 程默 – 博客园 https://www.cnblogs.com/cheng…8、rsync 使用示例 |《Linux 就该这么学》https://www.linuxprobe.com/rs…9、Linux 之 rsync 数据同步服务 – 潇潇、寒 – 博客园 http://www.cnblogs.com/caicai…10、【Linux】Linux 下同步数据 scp 与 rsync – zwan0518 的专栏 – CSDN 博客 https://blog.csdn.net/zwan051…