Ubuntu常用命令和文件笔记

常用命令

tar系列 压缩-解压

类型压缩解压
.tar.gztar -zcvf <archive>.tar.gz <files>tar -zxvf <archive>.tar.gz -C <folder>
.tar.bz2tar -jcvf <archive>.tar.bz2 <files>tar -jxvf <archive>.tar.bz2 -C <folder>
.tar.xztar -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>同killall
xkill <program>杀死图形界面程序

后台运行进程

nohup <command> &忽略挂断信号,且标准输出重定向到 nohup.outnohup 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 {fd}`
按大小`-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

修改主机名

  1. 修改 /etc/hostname 文件
  2. 修改 /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

常见的管道操作命令有:

过滤排序去重计数同时输出到文件和屏幕参数
grepsortuniqwcteexargs

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
-------------本文结束-------------
0%