整理多而杂的常用工具,以备日后查找用
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 eth0Destination
,Gateway
,Genmask
分别表示目的网络号,网关,子网掩码。例如要访问172.19.89.119
,按行与Genmask
向与,结果是172.19.80.0
,与第三行Destination
相匹配,所以选择第三行配置。如果访问某个IP找不到匹配的路由项,则选default
(第一行)。
Flags
中U
表示used
,G
表示Gateway
,H
表示Host
。Iface
表示路由对应的网卡。
添加一条路由: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
head
和tail
用于查看文件的前几行和后几行,默认展示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
一般把find
和xargs
连用,查看文件详细信息: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.packfind
查询的默认包含文件夹和文件,如果只查询文件夹,可以用-type d
,只查找文件-type f
。
根据时间查询,一般用法find <path> -[c/m/a][time/min] [+/-]<day>
。其中例如c
是修改(Change)(修改文件包括权限),m
是(Modify)(修改文件内容),a
是(Access)(访问文件内容)。time
和min
表示天/分钟。例如:查询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而快速向文件写入多行。
参考资料: