1 文件查看
| 常⽤命令 | 作⽤ |
|---|---|
| cat file1 | 查看⽂件内容 |
| cat -n file1 | 查看内容并标示⾏数 |
| cat xxx.txt | awk '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 file2 | uniq |
| sort file1 file2 | uniq -u |
| sort file1 file2 | uniq -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
c3 paste 命令
paste - merge line
- 将一个文件所有行 merge 到一行中,用特定的分割符(默认的是?)
- 将两个文件按行 side-by-side merge 起来
- 将两个文件拼接到一起
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,再展示文件23.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:比较文件。若提供目录,则比较目录中相同文件名的文件,但是不比较子目录。
- 比较两个文件
- 忽略空白行比较两个文件
- 并列的方式比较两个文件
### 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 命令
- 将文件切分 10 份
- 将文件切分,每份 10 行
- 将文件切分,按照 B、KB、MB 等大小
4.1 cat 命令
- 打印文件 1 的内容
- 将文件 1 内容写入到文件 2
- 将文件 1 内容追加到文件 2
- 打印文件内容时,打印行号
- 清空文件 1 的内容
### cat 命令
cat tmp.txt
cat tmp.txt > tmp2.txt
cat tmp.txt >> tmp2.txt
cat -n test.sh
cat /dev/null > tmp.txt4.2 file 命令
- 查看文件类型
- 查看文件编码
### 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 命令
- 将文件切分 10 份
- 将文件切分,每份 10 行
- 将文件切分,按照 B、KB、MB 等大小
split -l 10 ./test.txt # 每份 10 行
split -n 10 ./test.txt # 10 份文件(相同 size)
split -b 512 ./test.txt # 每份 512 bytes4.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.txt4.9 lndir 命令
lndir 命令用于连接目录内容。