整理多而杂的常用工具,以备日后查找用
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而快速向文件写入多行。
参考资料: