Linux 常用命令
显示任意路径下所有文件夹的大小
下面的命令显示 /var
下所有文件夹的大小:
1 | ls --color=none -lhd /var/* | awk '$1~/^d/ {print $9}' | xargs sudo du -sh` |
按照某一列进行排序
下面的命令对当前文件夹下的所有文件进行降序排序
1 | ls -alhS # -h means --human |
编码转换
1 | iconv -f UTF-8 -t GBK -c /path/to/file |
-s : silences warnings
-c : omits invalid characters from output
-f : source encoding
-t : target encoding
查看 jar 包内容
1 | jar -tf test.jar |
统计文件行数或单词数
1 | wc -l /path/to/file # line count |
获取文件指定行
1 | sed -n 5,10p /path/to/file |
获取文件的第5-10行
获取文本的第 k 列
1 | cut -d '\t' -f 1 total # cut 只支持单个字符分割,默认是\t |
例如:
1 | echo "word1SEPword2" | awk -F 'SEP' '{print $1, $2}' |
word1 word2
1 | echo 'w1 ,; w2 ,, w4' | awk -F '[[:blank:],;]+' '{print NF}' |
3
按照连续的空白、’,’, ‘;’分割,NF 表示 Number of fields。表示分割之后的 field 的数目。
参考:正则表达式
文本行去重,相同行数统计
1 | echo " |
结果为:
This is line1
This is line2uniq -c
表示统计形同行的数目
例子:1
echo "word1 word1 word2 word2 word2" | xargs -n1 | sort | uniq -c
一个简单的 wordcount 程序。其中
xargs -n1
用于把每个单词转成一行。
ATTENTION: 使用 uniq 之前必须经过 sort, 如果uniq 需要保持原来的顺序, 可以使用命令awk '!x[$0]++' filename
.
文件排序
1 | sort /path/to/file # 对文本行进行字符串排序 |
-g : 按照实数排序,而不是字符串
-r : 倒序排列
-h : 可以排序以 K, M, G 为单位的数字,只有新版本的 sort 支持这个参数
例子:1
ll --color=never | awk '{print $9}' | xargs du -s | sort -k 1 -r -g
功能:对当前目录下的所有文件夹从大到小排序
–color : 去掉 ll 或 ls 命令的颜色
文本替换
1 | sed 's/word1/word2/g' /path/to/file # 将文件中所有的 word1 替换成 word2,并将结果打印到终端 |
例子:1
sed -i '/^$/N;/^\n$/D' /path/to/file # 删除多余的空行
更多关于 sed 的用法参考:
15 Useful ‘sed’ Command Tips and Tricks
比较两个命令的执行结果有什么不同
1 | diff <(command1) <(command2) |
diff 命令只能比较两个文件的不同,所以为了比较两个命令的输出,要把输出转换成一个文件名传递给 diff,这种技术叫做“Process Substitution”,参考:
How do I diff the output of two commands
Process Substitution
例子:1
diff <(ack "word1" | cut -d ':' -f1 | uniq) <(ack "word2" | cut -d ':' -f1 | uniq) # 比较包含 word1 的文件和包含 word2 的文件有哪些不同
查看端口占用情况
1 | sudo lsof -i:8080 |
文件传输
rsync 比 scp 更加方便,快速
1 | 把 src (文件或文件夹) 放在 dest 目录下,即 dest 目录下会多出一个 src 目录 |
-a 表示递归上传,并保持所有属性
-v表示上传过程中显示上传信息,包括正在上传的文 件,以及总共上传的字节数等
-z表示在传输过程中将使用压缩
-P表示显示上传进度
-u表示更新操作,上传时将跳过修改时间比要上传的文件新的文件
ssh, scp, rsync 自动输入密码
1 | sshpass -p password ssh username@host |
awk
1 | 字符串拼接 |
$0 表示整行,$n 表示第 n 行
'!/(cpp|h)/{print $0}'
中感叹号表示不匹配
文件查找
1 | find /path -name "*.c" # 查找后缀为.c 的文件 |
进程监控
1 | pstree -p <pid> # 根据进程号查看线程号 |
获取文件夹下所有文件列表(递归地)
1 | find -L /path/to/directory |
wget
1 | wget -r -np ftp://hostname/home/username/directory # 下载文件夹 |