常用命令
tar
系列 压缩-解压
类型 | 压缩 | 解压 |
---|---|---|
.tar.gz | tar -zcvf <archive>.tar.gz <files> | tar -zxvf <archive>.tar.gz -C <folder> |
.tar.bz2 | tar -jcvf <archive>.tar.bz2 <files> | tar -jxvf <archive>.tar.bz2 -C <folder> |
.tar.xz | tar -Jcvf <archive>.tar.xz <files> | tar -Jxvf <archive>.tar.xz -C <folder> |
zip
- 压缩:
zip -r <compress>.zip /path/to/dir
- 带密码:
-e
- 排除:
-x /path/to/exclude
- 带密码:
- 解压:
unzip [-O gbk] <compress>.zip [-d /path/to/dir]
kill
系列
kill -9 <pid> | 强制杀死进程 |
---|---|
killall <program> | 杀死程序下的一系列进程 |
pkill <program> | |
xkill <program> | 杀死图形界面程序 |
后台运行进程
nohup <command> & | 忽略挂断信号,且标准输出重定向到 nohup.out | nohup python3 Untitled-1.py & |
---|---|---|
(<command>< &) | 运行一个新的session,且ppid为1,因此不属于当前终端 | (python3 Untitled-1.py &) |
查看文件大小
du -sh <file>
查找
简单查找
- 按文件名
locate <file>
- 按文件内容
grep -r <file> /dir/to/search
高级查找
find /dir/to/search [-options]
常用参数
按名称 | -name <file> | 文件名开头若用通配符需要 \ 来转义 |
---|---|---|
按类型 | `-type {f | d}` |
按大小 | `-size {+ | -} |
按访问时间 | `-atime {+ | -} |
按内容修改时间 | `-mtime {+ | -} |
按属性修改时间 | `-ctime {+ | -} |
按用户 | -user <user-name> | |
按权限 | -perm <number> | 参数是一个三位八进制数,每一位8进制数的二进制位表示rwxr 的组合,而3位8进制数分别表示所有者,所属组和其他用户,比如755表示文件所有者可读可写可执行,所属组和其他用户可读可执行 |
逻辑判断
例1:查找当前目录下后缀为txt或conf的文件
find ./ -name \*.txt -or -name \*.conf
例2:查找/root文件夹下大于256MB的文件,并排除/root/Videos文件夹
find /root -size +256M -not -path /root/Videos/\*
精简命令查询工具tldr
https://github.com/tldr-pages/tldr
tldr <command>
dpkg
安装方式
安装 | dpkg -i <package>.deb |
---|---|
删除 | dpkg -r <package> |
显示信息 | dpkg -l <package> |
列出关联文件 | dpkg -L <package> |
查找deb包 | `dpkg –list |
rpm包安装
- 工具:
alien
- 转为deb包:
alien <package>.rpm
使用aptitude
工具替代apt
aptitude update | 更新可用的包列表 |
---|---|
aptitude install <package> | 安装包 |
aptitude remove <package> | 删除包 |
aptitude purge <package> | 删除包及其配置文件 |
aptitude search <keyword> | 搜索包 |
aptitude show <package> | 显示包的详细信息 |
aptitude clean | 删除下载的包文件 |
aptitude autoclean | 仅删除过期的包文件 |
网络相关
域名解析
- 简单查询:
nslookup <domain>
- 清除dns缓存:
/etc/init.d/dns-clean start
netstat
- 查看服务[tcp/udp]:
netstat -anp[t/u] | pgrep <service>
- 查看端口[tcp/udp]:
netstat -anp[t/u] | grep <pid>
- 内核路由表:
netstat -rn
网络扫描工具nmap
- 主机探测:
nmap -sS 192.168.1.0/24
(SYN半开隐身扫描) - 端口扫描:
nmap 192.168.1.1 -p 1-65525
ssh 连接
登录 | ssh <user@host> [-p <port>] | 默认22号端口 |
---|---|---|
获得主机分配的终端 | ssh -T <user@host> | 可用来测试连接 |
生成rsa公钥私钥 | ssh-keygen -t rsa | |
发送公钥 | ssh-copy-id <user@host> | |
查找 | ssh-keygen -F <host> | |
删除 | ssh-keygen -R <host> |
查看内核和系统版本
内核信息 | lsb_release -a |
---|---|
系统版本 | uname -sr |
修改主机名
- 修改
/etc/hostname
文件 - 修改
/etc/hosts
对应的字段
硬盘设备
查看硬盘 | fdisk -lu [/dev/<device>] |
---|---|
显示分区文件系统 | df -h [/dev/<device>] |
挂载设备
- 挂载设备:
mount [-t <file-type>] /dev/<device> /mnt/<mount-point>
- 挂载文件夹:
mount --bind path/to/<old> path/to/<new>
管道操作
<command-1> | <command-2> | ...
前一个命令的结果输出当做后一个命令的输入。命令需要支持标准输入和输出,例如:
ls -la ~ | less # 用less命令显示ls -al的结果
ps -aux | grep chrome | sort # 过滤谷歌浏览器相关进程并排序
echo '2^10000' | bc # bc为计算器命令, 计算2^10000
常见的管道操作命令有:
过滤 | 排序 | 去重 | 计数 | 同时输出到文件和屏幕 | 参数 |
---|---|---|---|---|---|
grep | sort | uniq | wc | tee | xargs |
由2>&1
的引入
文件描述符fd:
0
表示stdin标准输入1
表示stdout标准输出2
表示stderr标准错误
标准输出重定向等价写法
echo "Hello" > greet
echo "Hello" 1> greet
以一段既能输出标准输出流又能输出标准错误流的Java程序为例:
public class App {
public static void main(String[] args) {
System.out.println("stdout output");
System.err.println("stderr output");
}
}
javac App.java # 编译
java App # 运行
# 屏幕输出:
# stdout output
# stderr output
尝试按以下命令运行并将标准输出和错误都输出到日志文件log中:
java App > log 2> log
# log文件内容:
# stderr output
结果日志文件里竟然只有标准错误输出。而由结果我们又不难知道是后输出的标准错误流覆盖了先行的标准输出流的输出。
2>&1
含义
&
:表示“等同于”2>1
:将标准错误流输出到名为“1”的文件中2>&1
:将标准错误输出重定向到标准输出,即将fd2重定向到1
借助2>&1
来实现将标准输出和错误都输出到日志文件log中:
java App > log 2>&1
# log文件内容:
# stdout output
# stderr output
上面的命令如果写作:
java App 2>&1 > log
# 屏幕输出:
# stderr output
#
# log文件内容:
# stdout output
这个过程就相当于先将fd2重定向到1,将标准错误重定向到了标准输出打印到了屏幕,而标准输出又被重定向到了文件。
xargs
把前一个命令的输出作为做后一个命令的参数。
例1: cat输出文本
echo "Hello World" >> hello.txt
echo "hello.txt" | cat # 输出 hello.txt
echo "hello.txt" | xargs cat # 输出 Hello World
可以看出若不用xargs, 文本并没有传入到cat参数中
例2: find命令中代替 -exec
find ~/Downloads/ -name \*.png | xargs tar -cvf img.tar # 查找Downloads文件下所有png格式的文件并打包为img.tar
- 使用
-i 选项
, 并在命令中添加{}
来确定传递的参数的位置
例3: 将查找到的所有tar文件解包到指定文件夹
find ~/Downloads/ -name \*.tar | xargs -i tar -xvf {} -C ~/Downloads/
tee
命令
将用户输入的数据同时保存到文件,一般和管道操作一起使用
例: 将字符串”Hello World”打印在屏幕上,并同时输出到名为greet的文件中
echo "Hello World" | tee greet
sed
命令
作用是编辑文本,可以对来自文件、以及标准输入的文本进行编辑
插入/删除/替换/查询行
例1: 在第二行后插入一行
echo '1\n2\n3\n4\n5' | sed '2 a 2.5' # 第2行后追加2.5
echo '1\n2\n3\n4\n5' | sed '3 i 2.5' # 第3行插入2.5
例2: 删除第三行
echo '1\n2\n3\n4\n5' | sed '3 d'
例3: 把2到4行都替换为3
echo '1\n2\n3\n4\n5' | sed '2,4 c 3'
例4: 仅打印第2到4行
echo '1\n2\n3\n4\n5' | sed -n '2,4 p'
- n选项表示静默,即只显示处理后的结果
- 字符串中
2,4p
的p标记表示打印行
例5: 查找打印passwd文件中带有“root”关键字的行
cat /etc/passwd | sed -n '/root/p'
与vim的查询操作有点像,这里sed命令通过 '/<key>/<action>'
可以进行对关键字所在行的操作。在这里/p
就成了打印动作,也可以类似地换成上述的其他动作,而且查找时可以使用正则表达式
关键词替换
例6: 将字符串的b全部换成a
echo 'abababa' | sed 's/b/a/g'
动作s
表示替换,和上面格式不同,是写在最前面的g
作为标识符表示全局范围
例7: 把第二次字符串“ab”出现的位置替换为字符串“c”
echo 'abababa' | sed -n 's/ab/c/2p'
- 这里的 p 作用是标识符,表示第一个匹配
- 数字2表示从第二处匹配查找
因此关键词替换命令形式则为 's/<source>/<target>/<flag>'
例8: 使用正则表达式将文件 demo.txt 中所有大写字母修改为字符串 ‘#’ ,并将小写字母改为字符串‘$’
echo "Hello World" > demo.txt
sed -e 's/[A-Z]/#/g' -e 's/[a-z]/$/g' -i demo.txt
# demo.txt文件内容:
# #$$$$ #$$$$
e 选项
表示多步处理i 选项
表示将结果直接作用到文件
例9: 批量替换
grep -rl 'old-string' /path/to/dir | xargs -i sed -i 's/old-string/new-string/g' {}
常用文件
源文件列表 | /etc/apt/sources.list | 更换国内源加速 |
---|---|---|
第三方软件安装处 | /opt/ | |
第三方软件安装处 | /usr/local/ | |
快捷方式图标 | /usr/share/applications/ | 存放desktop文件 |
开机调用 | /etc/rc.local | 存放开机调用脚本 |
服务脚本 | /etc/init.d | |
用户变量 | /etc/profile | |
host文件 | /etc/hosts | 修改域名指向 |
用户 | /etc/passwd | 存放所有用户信息, 对应shadow文件 |
用户组 | /etc/group | 同上 |
系统字体 | /usr/share/font | |
黑洞 | /dev/null |