帮助文档的符号说明
[]
:可有可无的东西
<>
:必须要有的东西,需要替换成实际的东西,如:路径、文件名等
-a|b|c
:只能选其中一个
-abc
:任意组合都可以,如-ab
、-bc
、-abc
等
...
:表示可以有多个(前面的东西),如:rm [OPTION]... [FILE]...
切换到root用户(持续有效)
sudo su
sudo -i
指令解析
ip
Linux ip 命令与 ifconfig 命令类似,但比 ifconfig 命令更加强大,主要功能是用于显示或设置网络设备。
ip 命令是 Linux 加强版的的网络配置工具,用于代替 ifconfig 命令。
ip addr
:查看IP地址
curl
-o|--output <file>
Write to file instead of stdout
-I|--head
Show document info only
获取数据并保存到文件:curl -o <file> <url>
或curl <url> > <file>
--connect-timeout <seconds>
设置最大请求时间
-m
或--max-time <seconds>
设置最大传输时间
grep
-v
反选
grep -v grep
-i
忽略大小写
-r
递归查找,并显示文件名
-n
显示行号,与-r
一起使用可以精确定位
-E
启用正则表达式
egrep
使用正则表达式同时搜索多个pattern
egrep 'pa|pb'
egrep
等价于grep -E
find
常用的格式:
find . -name '*aaa*' -type f
-name
:含通配符的模式要用引号括起来
-iname
:忽略大小写
-type f|d
:指定匹配的文件类型,f
文件,d
目录
-path './aaa/*'
:按路径过滤文件,即,只显示和./aaa/*
匹配的文件(*
是一个通配符)
对找到的文件执行命令:
find . -exec <command> \; # 一些不要文件参数的命令可以这样执行,如:pwd
find . -exec <command> {} [options] \; # 参数可以放在{}后面
find . -exec <command> {} \; -exec <command> {} \; # 执行多个命令
find . -exec <command> {} +
find . -execdir <command> {} +
-exec <command> {} +
:对找到的每个文件执行指定命令,占位符{}
代表当前的文件名,+
表示在后面追加所有找到的文件,执行命令的目录是调用find
的目录,-exec
存在安全隐患(没看太懂)
-execdir
:在找到的文件所在目录执行命令,可以避免-exec
的安全隐患
sed
一些常用的总结:useful-sed
sed -n '233p'
打印第233行
sed 's/RegExr/../[g|p]'
/
,@
,都可以作为分隔符
s
:表示执行替换动作
g
:替换每一个匹配到的模式,默认只替换第一个匹配到的模式
p
:打印匹配到的行,通常与-n
选项同时使用
/<pattern>/d
:删除行
&
is special in the replacement text: it means “the whole part of the input that was matched by the pattern”To insert an actual ampersand in the replacement text, use
\&
.
选项
-r|-E
:使用扩展的正则表达式(分组匹配,BRE:\(ab\)
,ERE:(ab)
)
-n|--silent|--quiet
:不打印文件内容,默认会把(处理后的)文件内容全部打印出来
-i|--in-place
:将标准输出重定向到文件,一般不和-n
同时使用,因为-n
不会打印原文到标准输出
-i.bak
:创建备份文件,.bak
表示备份文件的后缀,可指定任意后缀
当使用-n
和/p
确认命令无误后,改为-i
覆盖原文件时,忘记删除/p
,导致出现连续的重复行,解决方案:sed 与 awk 处理重复行
分组匹配
小括号括起来的模式(.{10})
匹配到的内容,可以在替换的时候用\n
保留,n取1、2、3……代表匹配到的第几组,如:
sed -ri 's/^last-updated-date: (.{10}) (.{8}) (.{3})(.{2})$/last-updated-date: \1T\2\3\:\4/' $file
只处理第一次命中的行
sed -r '0,/^last-updated-date:.*$/{/^last-updated-date:.*$/d}' $file
awk
awk '<pattern> {<action>}'
- <pattern>:用来筛选“行”,如
$3=="abc"
- <action>:执行的具体操作(对筛出来的“行”),如
print $3
- 默认以空格分段,
$1 $2 $3 ...
表示第几段,$0
表示整行
例1:awk '{print $1 $3}' <file>
打印文件中每行的第一和第三个字符串(字符串以空格为区分)
例2:ps aux | awk '$1=="aaa" {print $0}'
打印用户名为aaa
的进程
xargs
xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令。
ps aux | grep <process name> | grep -v grep | awk '{print $2}' | xargs kill -9
top
选项
-u|U [user]
只显示指定用户的进程
按键说明
按键 | 说明 |
---|---|
h | 查看帮助 |
1 | 显示每个cpu核心的使用情况 |
P | 按cpu使用率排序 |
M | 按内存使用率排序 |
T | 按累计时间排序 |
R | 倒序 |
c | 仅命令名称或包含命令行参数 |
z | 以更明显的颜色区分运行中(R)程序 |
i | 忽略闲置和僵尸进程 |
f | 自定义显示内容(仅本次生效) |
d | 设置刷新间隔(delay) |
k | 输入PID,kill进程 |
alt + j/k/h/l | 上下左右移动 |
ps
自定义查看进程信息ps -A -ostat,user,pid,ppid,start,cmd
cp
-n, --no-clobber
不覆盖已有文件
-i, --interactive
交互式询问是否覆盖
read
-p PROMPT
:设置提示字符串PROMPT
-n 1
:只读入1个字符
head / tail
head -n 3 [file]
查看文件头3行
tail -n 3 [file]
查看文件尾3行
tr
translate or delete characters(替换或删除字符——逐字符处理)
从标准输入设备读取数据,也可通过管道输入,结果输出到标准输出设备
tr [OPTION]... <SET1> [SET2]
将 SET1
中的字符替换为 SET2
中的对应字符
Translation occurs if -d is not given and both SET1 and SET2 appear. –
man tr
例子:
-
tr abc 1
把字符a
b
c
都换成1
-
tr -d '\n'
删除换行符,转义字符要加引号 -
tr '\n' ,
换行符替换为逗号,
-
tr a-z A-Z
小写转大写
dpkg
-
清理残余配置:
dpkg -l | grep ^rc | awk '{print $2}' | sudo xargs dpkg -P
rc
的含义:-
r
: the package was marked for removal -
c
: the configuration files are currently present in the system
-
-
dpkg-statoverride: error: an override for '/some/file/path' already exists; aborting
解决方案:
sudo dpkg-statoverride --remove /some/file/path
Unix指令 增强版
fd
- 安装
Manjaro: sudo pacman -S fd
fd -h
中有详细的使用说明
-
Usage
fd [FLAGS/OPTIONS] [<pattern>] [<path>...]
-
FLAGS
-H
显示隐藏文件 -
OPTIONS
-e
指定后缀搜索
常见操作
搜索历史命令
在终端按Ctrl + r
,然后输入关键字,就会出现包含关键字的最近使用过的命令,反复按Ctrl + r
继续往历史方向搜索(reverse, backward);Ctrl + s
搜索方向与其相反(forward)
How do I search my command-line history for commands I used before?
获取并杀死某个进程
ps aux | grep <process name> | grep -v grep | awk '{print $2}' | xargs kill -9
后台运行
nohup <process name> > /dev/null 2>&1 &
-
nohup
不中断 -
<process name>
要运行的程序 -
> /dev/null
标准输出重定向到/dev/null(丢掉 销毁) -
2>&1
标准错误(stderr)重定向到标准输出(stdout), 递归地重定向到/dev/null-
0
stdin 标准输入 -
1
stdout 标准输出 -
2
stderr 标准错误
-
-
&
后台运行
Shell管理
查看已有shellcat /etc/shells
查看当前shellecho $SHELL
更改当前用户的默认shellchsh -s /bin/bash
终端设置代理
该终端下的网络指令都会根据这三个环境变量来决定是否走代理
注意区分大小写
export http_proxy=http://localhost:7890
export https_proxy=https://localhost:7890
export ALL_PROXY=socks5://localhost:7891
可能遇到的问题
- 开启代理后无法从github clone
报错:
curl: (35) OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to 127.0.0.1:7890
解决方案:未知。。。
curl查询公网出口ip
curl ipecho.net/plain
curl ifconfig.me
curl ipinfo.io
curl www.trackip.net/ip
curl cip.cc
更改主目录文件夹名为英文
sudo pacman -S xdg-user-dirs-gtk
export LANG=en_US
xdg-user-dirs-gtk-update
显示文件中的非打印字符(隐藏字符)
-
cat -A
等价于cat -vET
-v, --show-nonprinting
-E, --show-ends
-T, --show-tabs
-
vim中
:set invlist
(好像不行)
批量修改文件名
rename
可以实现批量重命名文件,有两种实现:
-
rename
:一个Perl脚本,类似sed
的正则替换语法 -
rename.ul
:util-linux package的一部分,简单易用的语法,用?
匹配任意一个字符;新版Ubuntu(18.04以上)好像只有这种
选项:
-
-v|--verbose
:打印出被更改的文件 -
-n|--no-act
:不发生实际的改动 ,结合-v
确认哪些文件会被更改(类似rsync -vn
)
将所有以.htm结尾的文件名中的.htm修改为.html,如下:
rename 's/\.htm$/\.html/' *.htm
rename.ul -vn .htm .html *.htm
发出通知
Ringing the terminal bell
echo -e "\a"
查看发行版信息
cat /etc/*release
文本文件去除重复行
sort <file.txt> | uniq
(输出到stdout
)
uniq
只检测相邻的重复行,所以需要先sort
查找指定后缀的文件
locate "*.desktop"
文件的时间参数
文件重命名后改变的是CTime,Change time
Linux 系统中,每个文件主要拥有 3 个时间参数(通过 stat 命令进行查看),分别是文件的访问时间、数据修改时间以及状态修改时间:
- 访问时间(Access Time,简称 atime):只要文件的内容被读取,访问时间就会更新。例如,使用 cat 命令可以查看文件的内容,此时文件的访问时间就会发生改变。
- 数据修改时间(Modify Time,简称 mtime):当文件的内容数据发生改变,此文件的数据?修改时间就会跟着相应改变。
- 状态修改时间(Change Time,简称 ctime):当文件的状态发生变化,就会相应改变这个时间。比如说,如果文件的权限或者属性发生改变,此时间就会相应改变。
用户组管理
将用户user到组group中
sudo adduser user group
查看用户user的用户id(uid),组id(gid)和所在的组(groups)
id user
端口
查看端口占用:
sudo lsof -i:3389
查看占用3389端口的程序(需要root权限,否则不会显示任何信息)
查看tcp连接:
sudo ss -tpln
显示进程需要root权限
最近安装的软件包
查看dpkg日志:grep " install " /var/log/dpkg.log
查看apt历史命令:grep " install " /var/log/apt/history.log
kill进程
kill [pid]
发送SIGTERM(15)信号,能被进程捕获并响应,进程自己执行结束代码,如无相应代码,则直接kill
kill -9 [pid]
发送SIGKILL(9)信号,不能被进程捕获,立即结束(不通知进程,暴力结束)
总结:TERM通知进程主动结束,KILL是进程被迫结束
根据man kill
,某些shell有a built-in kill command,无法通过-L
打印信号表,建议替换为/bin/kill
使用built-in kill(注意不是/bin/kill)可以杀死后台任务:kill %n
,n
为jobs
中的任务编号
可以通过builtin kill %1
调用built-in kill
打包、压缩、备份
-
打包只是把多个文件绑起来成为一个归档文件,常用命令
tar
-
压缩是通过特定算法来减小文件大小,常用命令
gzip
tar
-z #通过gzip压缩/解压文件 (*.tar.gz)
-j #通过bzip2压缩/解压文件 (*.tar.bz2)
-v #显示指令执行过程
-c #建立新的备份文件
-x #从归档文件中提取文件
-f #指定生成的文件名
-t #列出归档文件的内容
-C #切换工作目录,解压到指定目录
--strip-components=NUMBER #去掉NUMBER层文件夹:`/some/file`去掉1层文件夹为`file`
What does –strip-components -C mean in tar?
-
可省略
默认解压到当前(工作)目录,可以用-C
切换工作目录,即解压的目标目录
tar
命令一般都要结合-f
,用于指定要操作的tar文件,如查看tar包内容:tar tf
打包:
-
tar zcvf test.tar.gz /etc/
-
tar zcv 1 2 3/ > test.tar.gz
解压:
tar xvf test.tar
-
tar zxvf test.tar.gz
,z
代表需要压缩/解压 - 只提取部分文件:
tar xvf <tar包> [tar包中的文件]...
- 解压
.tar.zst
:tar xvf <.tar.zst>
gzip
只能压缩单个普通文件 (regular file),会忽略符号链接 (symbolic links)
gzip [OPTION]... <FILE>...
分别压缩给定的文件,每个源文件都会被一个压缩文件 .gz 替换(不会保留源文件)
选项 | 描述 |
---|---|
-l | 列出压缩文件的相关信息 |
-tv | 检测压缩包的完整性 |
-v | 显示详细信息 |
-k | 保留源文件(解压和压缩默认不保留源文件) |
有次压缩后,用gzip -l
查看信息,发现压缩率为负,原文件大小显示也不正确,不知道什么原因。。
解压:gunzip test.gz
zip
unzip <.zip> ['仅提取部分子文件夹/*']
仅提取指定文件,默认:保留目录结构、提取到当前文件夹
zip -sf <.zip>
(show files) 显示压缩包内容
-d <dir>
解压到指定目录
-j
忽略压缩包内的目录结构
rsync
--progress
显示进度条
-a
归档模式
-v
详细模式
-u, --update
This forces rsync to skip any files which exist on the destination and have a modified time that is newer than the source file. (If an existing destination file has a modification time equal to the source file’s, it will be updated if the sizes are different.)
--delete
镜像模式,会删除不存在于源地址而存在于目的地址的文件
-n|--dry-run
试运行,不会真的拷贝文件,配合-v
可以查看哪些文件会发生变动
--max-size='200k'
限制传输文件的大小,超过限制的文件不会被传输
apt-mark
设置软件包的各种状态(自动更新,手动更新,不更新)
设置软件包不更新,使sudo apt upgrade
忽略该包(不更新):
apt-mark hold [pkg] # 设为不更新
apt-mark unhold [pkg] # 恢复
apt-mark showhold [pkg] # 查看
设置和查看自动更新:
apt-mark auto [pkg]
apt-mark showauto [pkg]
设置和查看手动更新:
apt-mark manual [pkg]
apt-mark showmanual [pkg]
runlevel
2个常用的runlevel/target:
- multi-user.target: analogous to runlevel 3, Text mode
- graphical.target: analogous to runlevel 5, GUI mode with X server
查看runlevel:runlevel
或systemctl get-default
设置默认的启动runlevel:
systemctl enable multi-user.target
systemctl set-default multi-user.target
不重启系统,切换runlevel:init 3
可以通过切换runlevel为3来禁用Xserver
查看硬件
-
cpu
lscpu
cat /proc/cpuinfo
top
: load average 查看cpu负载w
: 查看登录用户和负载 -
mem
cat /proc/meminfo
pci硬件序列号
lspci -vnn | grep VGA -A 15
查看显卡详细信息
其中[10de:1e07]
代表硬件的序列号,在http://pci-ids.ucw.cz/read/PC/可以查询生产商和具体型号
查看显卡
sudo lshw -c display
(跟sudo lshw -c video
是一样的?)
configuration: driver=nvidia latency=0
表示驱动名字(?
modinfo nvidia
根据上面的名字,查看驱动模块的详细信息
netplan
netplan屏蔽了底层网络管理工具(renderer)配置的差异性,只需一个YAML
文件,就能生成对应的底层管理工具所需的配置。只要是netplan支持的底层管理工具就行,目前支持的renderer有:
- NetworkManager
- Systemd-networkd
YAML文件位于/etc/netplan
netplan apply
:修改YAML后,应用配置
networkctl
:查看网络设备
networkctl status
:显示所有ip的详细信息
bc
特殊变量
scale=3
保留3位小数
ibase=16
指定输入为16进制
obase=16
指定输出为16进制
不进入交互式环境直接计算:echo scale=3; 3/2 | bc
多条语句用分号 ;
隔开
ssh
ssh [-t] [-p port] [user@]hostname [command]
如果没有指定command
,默认运行一个login shell
如果指定了command
,则直接执行,不会运行login shell
多个命令用"
包起来,用;
或&&
分割
如果要执行交互性命令,如top
或sudo
,则添加需要-t
参数
-t
Force pseudo-terminal allocation.
参考