0%

Linux常用工具手册

整理多而杂的常用工具,以备日后查找用

route

route用于查看路由表

$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default DESKTOP-N0ED40G 0.0.0.0 UG 100 0 0 eth0
link-local 0.0.0.0 255.255.0.0 U 1000 0 0 eth0
172.19.80.0 0.0.0.0 255.255.240.0 U 100 0 0 eth0

DestinationGatewayGenmask分别表示目的网络号,网关,子网掩码。例如要访问172.19.89.119,按行与Genmask向与,结果是172.19.80.0,与第三行Destination相匹配,所以选择第三行配置。如果访问某个IP找不到匹配的路由项,则选default(第一行)。

FlagsU表示usedG表示GatewayH表示HostIface表示路由对应的网卡。

添加一条路由:route add -net 10.0.0.0/24 dev ens160

sudo/su

  • su是申请切换成root用户,需要输入root用户密码。如果某些系统没有设置过root密码,需要用sudo passwd root设置root密码。
  • sudo su是为当前用户暂时申请root权限,需要输入当前用户的密码。

su -c可以以root身份执行一条指令,例:su -c 'apt update'su -会切换成root用户,并切换到root用户默认的登录位置(\root)。

echo

echo默认输出换行,如果想输出不换行,用echo -n。例:echo 123; echo 456输出:

123
456

而用echo -n 123; echo 456输出:
123456

echo -e表示转义输出。

more

more <filename>可以弥补cat一次读入大文件大量占用内存的问题。more可以展示文件一部分内容,用Enter翻页,q退出。more可以指定每页行数和从哪一行开始读,例如:从第3行开始读,每页展示10行:more -3 +10 <filename>

head/tail

headtail用于查看文件的前几行和后几行,默认展示10行。-n可以指定展示行数,例如:展示文件前20行:head -n 10 <filename>

tail -f <filename>可以监控文件变化,可以用于实时监控日志。

du

du(disk usage)命令用于显示目录或文件的大小。-h可以优化展示结果,一般都会加上。-d指定深度。如分析/var下文件大小:cd /var; sudo du -h -d 1,输出各个文件夹大小:

0       ./backups
1.1G ./cache
472K ./crash
850M ./lib
0 ./local
2.0M ./log
0 ./mail
0 ./opt
0 ./snap
0 ./spool
0 ./tmp
12K ./www
1.9G .

xargs

xargs可以把管道的输出根据换行或者空格拆分成多个参数,提供给其他命令执行。
例如:echo "1.txt 2.txt 3.txt" | xargs -t touch会创建三个文件,-t表示输出执行结果,在执行创建文件前,控制台会打印出touch 1.txt 2.txt 3.txt。可以用-n指定每次传递的参数数量,例如:$ ls | xargs -t -n1 rm,每次只传1个参数,相当于调用了3次rm命令。控制台打出:

rm 1.txt 
rm 2.txt
rm 3.txt

如果要执行多个命令,可以用-I或者-i,用%作为参数占位符,例如:echo "1.txt 2.txt 3.txt" | xargs -t -I % sh -c "touch %; ls -l %",输出:sh -c 'touch 1.txt 2.txt 3.txt; ls -l 1.txt 2.txt 3.txt',创建了3个文件,并打印出文件信息。

之前的参数分割符是换行符或者空格,也可以指定分隔符。使用-d或者--delimiter选项设置自定义分隔符,可以是单个字符,也可以是以\开头的转义字符。例:echo -n 1.txt#2.txt#3.txt | xargs -d \# -t rm

xargs还支持直接从文件读取输入。先准备一份域名列表文件domains.txt:

$ cat > domains.txt << "EOF"
heredoc> www.whoisnian.com
heredoc> www.github.com
heredoc> www.baidu.com
heredoc> EOF

接下来xargs -a domains.txt -t -L 1 ping -c 1,用-a指定文件,-L指定每次读入的行数,这句命令将对每行的域名执行ping -c 1
ping -c 1 www.whoisnian.com 
PING www.whoisnian.com (45.77.145.72) 56(84) bytes of data.
64 bytes from 45.77.145.72: icmp_seq=1 ttl=48 time=266 ms

--- www.whoisnian.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 266.012/266.012/266.012/0.000 ms
ping -c 1 www.github.com
PING github.com (192.30.255.113) 56(84) bytes of data.
64 bytes from lb-192-30-255-113-sea.github.com (192.30.255.113): icmp_seq=1 ttl=48 time=174 ms

--- github.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 174.455/174.455/174.455/0.000 ms
ping -c 1 www.baidu.com
PING www.a.shifen.com (36.152.44.96) 56(84) bytes of data.
64 bytes from 36.152.44.96 (36.152.44.96): icmp_seq=1 ttl=58 time=4.47 ms

--- www.a.shifen.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 4.469/4.469/4.469/0.000 ms

grep

grep(Globally search a Regular Expression and Print)用于用正则过滤文本。常接在管道后:cat server.log | grep "Error"

grep也可直接以文件作参数,从文件中读取目标信息。上述写法等同于grep "Error" server.log。使用-n可以展示行号。如果日志文件分散在多个文件里,还可以用文件通配符:grep "Error" -n *.log。如果日志文件分散在多层目录里,要用-rn来递归遍历。查看日志报错一般还需要观察错误日志的上下文,-A <num1> -B <num2>用于输出目标行的上下几行,-A是After,-B是Before,比如查看”IOException”的上下10行:find . -maxdepth 3 -name "*.log" -print0 | xargs -0 grep -n "IOException" -A 10 -B 10 *.log

find

根据文件名查询,一般用法:find <path> -name <filename>
/home下查找1.txt文件可以用find /home -name 1.txt,如果用通配符查询,需要用引号把pattern括起来:find /home -name "*.txt",输出:

./1.txt
./2.txt
./3.txt

一般把findxargs连用,查看文件详细信息:find . -name "*.txt" -print0 | xargs -0 ls -l,这里的-print0是把输出用NULL连接取代原来的换行,由xargs -0指定用NULL作为分隔符。

根据大小查询,一般用法:find <path> -size [+/-]<size>。例如查询当前目录大于10M的文件:find . -size +10M -print0 | xargs -0 ls -l

-rw-r--r-- 1 thankod thankod 17789538 Dec  7 19:09 ./hello-rust/target/debug/deps/libclap-e118728b5a2a90f4.rlib
-rw-r--r-- 1 thankod thankod 11786802 Dec 7 16:32 ./hello-rust/target/debug/deps/libobject-6d4de7c5be0727d4.rlib
-r--r--r-- 1 thankod thankod 15766524 Dec 22 16:24 ./rust-lua/.git/objects/pack/pack-a3621f69371ce8cea6964696d69d5004e665eb90.pack

find查询的默认包含文件夹和文件,如果只查询文件夹,可以用-type d,只查找文件-type f

根据时间查询,一般用法find <path> -[c/m/a][time/min] [+/-]<day>。其中例如c是修改(Change)(修改文件包括权限),m是(Modify)(修改文件内容),a是(Access)(访问文件内容)。timemin表示天/分钟。例如:查询1天内修改的文件:find . -ctime -1,刚好1天修改的文件:find . -ctime +1,1天前修改的文件:find . -ctime -1

-maxdepth可以指定文件的深度。比如:查询10天前修改的当前目录深度2的大小小于1M的js文件:find . -maxdepth 2 -name "*.js" -ctime -10 -type f -size -1M

重定向符

>>>可以用于将命令输出重定向到文件中,区别是>是覆盖写入,而>>是追加写入。

echo -n HelloWorld > hello.txt # HelloWord
echo Linux >> hello.txt # HelloWorldLinux

<表示将文件作为命令的标准输入,<<表示从标准输入中读入,直到遇到分界符停止。例:
$ cat > hello.txt << "EOF"                                          130 ↵
heredoc> hello
heredoc> world
heredoc> EOF
$ cat hello.txt
hello
world

这种写法可以不用vim而快速向文件写入多行。

参考资料:

Disqus评论区没有正常加载,请使用科学上网