Linux指令

发布于 2020 年 09 月 28 日 | 更新于 2022 年 08 月 18 日

帮助文档的符号说明

[]:可有可无的东西

<>:必须要有的东西,需要替换成实际的东西,如:路径、文件名等

-a|b|c:只能选其中一个

-abc:任意组合都可以,如-ab-bc-abc

...:表示可以有多个(前面的东西),如:rm [OPTION]... [FILE]...

切换到root用户(持续有效)

sudo su

sudo -i

指令解析

ip

Linux ip 命令与 ifconfig 命令类似,但比 ifconfig 命令更加强大,主要功能是用于显示或设置网络设备。

ip 命令是 Linux 加强版的的网络配置工具,用于代替 ifconfig 命令。

Linux ip 命令

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 \&.

using sed with ampersand (&)

选项

-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

sed修改第一个匹配的行

awk

awk '<pattern> {<action>}'

例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

例子:

dpkg

  1. 清理残余配置:

    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
  2. dpkg-statoverride: error: an override for '/some/file/path' already exists; aborting

    解决方案

    sudo dpkg-statoverride --remove /some/file/path

Unix指令 增强版

Modern Unix

fd

fd是一种简单ㄡ快速和用户友好的find替代方案.

Manjaro: sudo pacman -S fd

fd -h中有详细的使用说明

常见操作

搜索历史命令

在终端按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 &

  1. nohup不中断
  2. <process name>要运行的程序
  3. > /dev/null标准输出重定向到/dev/null(丢掉 销毁)
  4. 2>&1标准错误(stderr)重定向到标准输出(stdout), 递归地重定向到/dev/null
    • 0stdin 标准输入
    • 1stdout 标准输出
    • 2stderr 标准错误
  5. &后台运行

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

可能遇到的问题

报错:

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

显示文件中的非打印字符(隐藏字符)

  1. cat -A等价于cat -vET

    • -v, --show-nonprinting
    • -E, --show-ends
    • -T, --show-tabs
  2. vim中:set invlist(好像不行)

批量修改文件名

rename可以实现批量重命名文件,两种实现:

选项:

将所有以.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 %nnjobs中的任务编号

可以通过builtin kill %1调用built-in kill

打包、压缩、备份

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

打包:

解压:

gzip

只能压缩单个普通文件 (regular file),会忽略符号链接 (symbolic links)

gzip [OPTION]... <FILE>...分别压缩给定的文件,每个源文件都会被一个压缩文件 .gz 替换(不会保留源文件)

选项 描述
-l 列出压缩文件的相关信息
-tv 检测压缩包的完整性
-v 显示详细信息
-k 保留源文件(解压和压缩默认不保留源文件)

Gzip Command in Linux

有次压缩后,用gzip -l查看信息,发现压缩率为负,原文件大小显示也不正确,不知道什么原因。。

解压:gunzip test.gz

zip

unzip <.zip> ['仅提取部分子文件夹/*']仅提取指定文件,默认:保留目录结构、提取到当前文件夹

zip -sf <.zip> (show files) 显示压缩包内容

-d <dir>解压到指定目录

-j忽略压缩包内的目录结构

rsync

--progress显示进度条

-a归档模式

-v详细模式

-u, --updateThis 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

查看runlevel:runlevelsystemctl get-default

设置默认的启动runlevel:

systemctl enable multi-user.target
systemctl set-default multi-user.target

不重启系统,切换runlevel:init 3

可以通过切换runlevel为3来禁用Xserver

reference

查看硬件

  1. cpu

    lscpu

    cat /proc/cpuinfo

    top: load average 查看cpu负载

    w: 查看登录用户和负载

  2. mem

    cat /proc/meminfo

Linux 系统信息收集备忘录

9个Linux 常用查看系统硬件信息命令(实例详解)

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有:

  1. NetworkManager
  2. 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

多个命令用"包起来,用;&&分割

如果要执行交互性命令,如topsudo,则添加需要-t参数

-t Force pseudo-terminal allocation.

参考

  1. SSH 远程执行任务