显示任意路径下所有文件夹的大小

下面的命令显示 /var 下所有文件夹的大小:

1
ls --color=none -lhd /var/* | awk '$1~/^d/ {print $9}' | xargs sudo du -sh`

按照某一列进行排序

下面的命令对当前文件夹下的所有文件进行降序排序

1
2
3
4
5
6
7
ls -alhS # -h means --human
# or
ls --sort=size -alh
# or
ls -al | sort -k 5 -nr # -n 按照字符串的数值比较大小, 会忽略 K, M, G 等单位
# or
ls -alh | sort -k 5 -hr # 支持 K, M, G 等 human-kind 单位

编码转换

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
2
wc -l /path/to/file # line count
wc -w /path/to/file # word count

获取文件指定行

1
sed -n 5,10p /path/to/file

获取文件的第5-10行

获取文本的第 k 列

1
2
3
4
5
cut -d '\t' -f 1 total # cut 只支持单个字符分割,默认是\t
awk '{print $9}' # awk 默认可以分割连续的空格
awk -F ',' '{print $1, $2}' /path/to/file # 按照字符','进行分割,并打印第1,2列
awk -F '[, ;]' '{print $1}' /path/to/file # 按照',', ' ' 或 ';' 进行分割
awk -F 'SEP' '{print $1}' /path/to/file # 按照字符串“SEP”进行分割

例如:

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
2
3
4
5
6
echo "
This is line1
This is line1
This is line2
This is line2
This is line2" | sort | uniq

结果为:
This is line1
This is line2
uniq -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
2
3
sort /path/to/file # 对文本行进行字符串排序
sort -k 2 /path/to/file # 按照第2列排序,默认分隔符为' ', '\t',注意支持单个字符
sort -k 2 -t ';' /path/to/file # 用';'作为分隔符,并按第2列排序

-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
2
3
sed 's/word1/word2/g' /path/to/file # 将文件中所有的 word1 替换成 word2,并将结果打印到终端
sed -i 's/word1/word2/g' /path/to/file # in-place replace
sed -i'.bak' 's/word1/word2/g' /path/to/file # in-place replace and back up original file

例子:

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
2
sudo lsof -i:8080
sudo netstat -ap | grep 8080

文件传输

rsync 比 scp 更加方便,快速

1
2
3
4
5
6
7
8
9
10
11
# 把 src (文件或文件夹) 放在 dest 目录下,即 dest 目录下会多出一个 src 目录
rsync -avz ./src ./dest
# src目录下的所有文件同步到dest下,dest下不会产生src文件夹
rsync -avz ./src/ ./dest
rsync -avz ./src ./dest/
# 目录完全同步,如果src中的某个文件被删除之后,dest中的也会被删除
rsync --delete -avz ./src/ ./dest
# 跳过上传 bin 和 log 目录
rsync -zavP --exclude='bin' --exclude='log' ./src/ ./dest
# 远程传输
rsync -vzP username@host:/path/to/src username@host:/path/to/dest

-a 表示递归上传,并保持所有属性
-v表示上传过程中显示上传信息,包括正在上传的文 件,以及总共上传的字节数等
-z表示在传输过程中将使用压缩
-P表示显示上传进度
-u表示更新操作,上传时将跳过修改时间比要上传的文件新的文件

ssh, scp, rsync 自动输入密码

1
sshpass -p password ssh username@host

awk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 字符串拼接
echo "hello world" | awk '{print "prefix_" $1}' # 输出为 prefix_hello
# 匹配指定模式的行
# 下面命令结果为
# line2.h
printf "line1.cpp\nline2.h\nline3.log" | awk '/2/{print $0}'
# 下面命令结果为
# line1.cpp
# line2.h
printf "line1.cpp\nline2.h\nline3.log" | awk '/(cpp|h)/{print $0}'
# 不匹配符合条件的行
# 下面命令结果为
# line3.log
printf "line1.cpp\nline2.h\nline3.log" | awk '!/(cpp|h)/{print $0}'

$0 表示整行,$n 表示第 n 行
'!/(cpp|h)/{print $0}' 中感叹号表示不匹配

文件查找

1
2
find /path -name "*.c" # 查找后缀为.c 的文件
find /path -name "*.c" -o -name "*.cpp" #同时查找后缀为.c 和 .cpp 的文件

进程监控

1
2
pstree -p <pid> # 根据进程号查看线程号
pstree -p `ps -e | grep retrms | cut -d' ' -f1` | wc -l # 查看进程 retrms 的线程数

获取文件夹下所有文件列表(递归地)

1
2
find -L /path/to/directory
tree -if /path/to/directory

wget

1
wget -r -np ftp://hostname/home/username/directory # 下载文件夹