管道符 |
在 Unix/Linux 系统中,|
(管道符)是一个非常重要的符号,用于将一个命令的输出作为另一个命令的输入。它避免了中间结果的临时存储,不需要手动保存中间文件,节省了磁盘 IO,从而提高了效率和便捷性
基本语法
command1 | command2 | command3 ...
command1
的输出将成为command2
的输入。command2
的输出将成为command3
的输入,依此类推。
可以用多个 | 符号串联多个命令,形成复杂的处理流程。例如:
ps aux | grep "apache" | awk '{print $2}' | xargs kill -9
- 列出所有进程。
- 筛选出包含 “apache” 的进程。
- 提取进程 ID。
- 终止这些进程。
注意事项
- 管道符号的作用基于文本流。因此,如果命令输出不是标准文本(如二进制数据),需要使用合适的工具进行处理。
- 如果数据量非常大,管道可能会成为性能瓶颈,此时可以考虑使用文件缓存或更高效的工具。
- 管道仅传递标准输出(stdout)。若要捕获错误信息(stderr),可以使用 2>&1 将错误流重定向到标准输出。
标准输入、标准输出、错误输出
1960 年代,Unix 的开发者(如 Ken Thompson 和 Dennis Ritchie)设计了统一的 I/O 机制,用于简化程序和操作系统之间的交互。 他们提出了文件描述符的概念:每个进程都通过文件描述符与外界通信。这种设计把一切(文件、设备、网络)都看作文件,极大地简化了系统设计。
Unix 的设计者将每个进程默认关联到三个文件描述符,用于处理输入和输出:
文件描述符 0:标准输入(stdin)。
文件描述符 1:标准输出(stdout)。
文件描述符 2:错误输出(stderr)。
例如:合并标准输出和错误输出
# 将标准输出和错误输出都重定向到 all_output.txt
ls non_existent_file > all_output.txt 2>&1
/dev/null
/dev/null 是一个特殊设备,用于丢弃数据。通过将输出重定向到 /dev/null,可以有效地忽略不需要的输出
例如:忽略错误信息
ls non_existent_file 2>/dev/null
dry-run
"dry-run"(干运行/试运行)是一个常见的命令选项,它通常用于模拟命令的执行结果而不实际执行命令本身。这意味着当你在执行一个命令时使用 "dry-run" 选项时,命令会预测并显示它将会执行哪些操作,但不会真正执行这些操作
命令行工具缓存清理
在命令手册里找关键字 cache clean remove prune
fd命令
sudo fd --hidden --no-ignore --exclude /System/Volumes -t d --prune --ignore-case hello-world .
--hidden
搜索隐藏文件,MacOs下隐藏文件默认以.
开头--no-ignore
不要忽略任何文件,如.gitignore--exclude
排除某个特定目录,也可以使用管道符进行二次过滤-t
文件类型d
表示文件夹f
表示文件--prune
这个很有意思。例如要找目录book
,匹配到/a/b/book
后,就会停止查找子目录。避免book目录下还有其他文件夹也叫book,重复查找,属于是浪费时间了。如果搜索的类型是f
,那么这个参数就不起作用。-i
或者--ignore-case
忽略大小写-s
或者--case-sensitive
不忽略大小写
rg(ripgrep)命令
sudo rg --hidden --no-ignore --files-with-matches -i hello-world .
sudo rg --hidden --no-ignore -g '!/System/Volumes/Data/**' --files-with-matches -i hello-world .
--hidden
搜索隐藏文件--no-ignore
搜索ignore文件-g,--glob
这是glob语法,加!
可用来排除某些文件夹的,也可以使用管道符进行二次过滤-l,--files-with-matches
输出时只显示匹配到的文件名,不会打印具体的行,如果想输出具体的内容,就不要这个参数--files-without-match
反选,只输出未匹配到的文件--invert-match
反选,只输出未匹配到的行-i
搜索关键字忽略大小写
Mac trash命令
# 安装
brew install trash
# 删除文件或目录
trash -v <文件/目录>
-v
verbose模式
xargs命令
xargs,将输入数据转换为参数列表传递给其他命令。例如:
ls
命令列出当前目录下所有的文件,xargs就会把所有文件名组装成一个列表传递给下一条语句执行。有些命令无法通过管道符进行操作,这就是xargs存在的意义。
命令的基本语法如下:
command | xargs [options] [command]
command
上一条执行的命令,如ls
、grep
、find
options
一些选项,可以用来控制xargs的行为这里先不写,以后使用到了再写[command]
这条命令用于接收xargs传过来的参数。,默认是echo,也就是把xargs的参数列表打印出来
# 把当前目录下名字包含hello的文件删除
ls -al | grep hello | xargs trash -v
curl命令
# 请求网址,并打印出http的请求过程
curl -vIL https://www.baidu.com
# 将baidu.com的首页保存到本地
curl -OL https://baidu.com
# 下载sh脚本并执行
curl -fsSL https://deno.land/install.sh | sh
- -v 打印完整信息,分析http请求的时候很有用,连TLS握手🤝都打印出来了,很给力
- -L 跟踪网址的重定向,如果不加这个参数,有些网址有重定向,它就不会继续请求
- -i 打印响应头和响应body
- -I 只打印响应头
- -o 将output输出到指定的文件,如
/dev/null
或者test.abc
- -O 将文件写入到本地,文件名=远程资源的文件名,如远程资源为exapmle.com/file/1.txt,那么下载到本地就是1.txt
- -f --fail 如果 HTTP 响应状态码是 400 或更高(即 4xx 或 5xx 错误),curl 会退出并返回非零的退出码。不会将服务器返回的错误页面内容输出到标准输出。
- -s slient模式,不打印progress和error信息
- -S show an error message if it fails
- --connect-timeout 超时,单位:秒
- --write-out 可以打印出很多东西,我认为最有价值的就是能够打印出整个网络请求执行时间
curl -sSL -o /dev/null --connect-timeout 5 --write-out \ "\n--------------REQUEST TIME TABLE-----------------\n time_namelookup: %{time_namelookup}s\n time_connect: %{time_connect}s\n time_appconnect: %{time_appconnect}s\n time_pretransfer: %{time_pretransfer}s\n time_redirect: %{time_redirect}s\n time_starttransfer: %{time_starttransfer}s\n ----------\n time_total: %{time_total}s\n\n" \ https://facebook.com
wget命令
下载文件
# 把文件下载到当前目录
wget https://example.com/test.txt
分析http请求链
wget https://baidu.com --debug -O /dev/null
输出信息包括了HTTP请求和响应头,以及网络请求过程中的详细信息
--2023-02-22 23:30:09-- https://www.baidu.com/
Certificates loaded: 137
正在解析主机 www.baidu.com (www.baidu.com)... 104.193.88.123, 104.193.88.77
Caching www.baidu.com => 104.193.88.123 104.193.88.77
正在连接 www.baidu.com (www.baidu.com)|104.193.88.123|:443... 已连接。
Created socket 4.
Releasing 0x0000561d53929890 (new refcount 1).
---request begin---
GET / HTTP/1.1
User-Agent: Wget/1.20.1 (linux-gnu)
Accept: */*
Accept-Encoding: identity
Host: www.baidu.com
Connection: Keep-Alive
---request end---
已发出 HTTP 请求,正在等待回应...
---response begin---
HTTP/1.1 200 OK
Content-Length: 2381
Content-Type: text/html
Date: Wed, 22 Feb 2023 15:30:10 GMT
Server: bfe
---response end---
200 OK
brew
清理缓存
# Remove all cache files older than specified days. If you want to remove everything, use --prune=all
brew cleanup --prune=all
# Scrub(means a thorough wash or clean) the cache, including downloads for even the latest versions. Note that downloads for any installed formulae or casks will still not be deleted
brew cleanup -s
# Uninstall formulae that were only installed as a dependency of another formula and are now no longer needed.
brew autoremove
后台进程管理
-
systemd
是Linux系统中默认的系统和服务管理器,可以用于管理和控制各种系统服务,包括启动、停止、重启、自启动等 -
supervisor
它适用于需要管理多个进程的环境,例如Web服务器、应用服务器等1.安装
参照各个系统的安装步骤。supervisor是python写的,可能需要python环境
2.在supervisor的配置文件目录
/etc/supervisor
下创建一个配置文件conf.d(最好每个对应一个conf.d文件)[program:myapp] command=/usr/bin/python /path/to/myapp.py directory=/path/to/myapp (directory2=/path/to/myapp) (directory3=/path/to/myapp) user=myuser autostart=true autorestart=true redirect_stderr=true stdout_logfile=/path/to/myapp.log
- program:myapp 是进程的名称,可以自定义;
- command 是要运行的命令,可以是任何可执行文件的路径,可以包括参数;使用全路径
- directory 指定工作目录。如果不指定directory参数,Supervisor将使用默认的工作目录(通常为/)。这可能会导致应用程序无法正常工作,因为它无法访问它需要的文件或资源。可以指定多个目录每个目录一行
- user 运行用户
- autostart 指定Supervisor是否在启动时自动启动进程;
- autorestart 指定Supervisor是否在进程退出时自动重启进程;
- redirect_stderr 错误日志输出到标准错误输出流
- stderr_logfile 和 stdout_logfile 指定日志文件的路径,分别用于标准错误输出和标准输出。
3.启动Supervisor服务
# 默认会加载/etc/supervisord目录下所有的配置文件 supervisord #也可以通过-c参数指定某一个配置 supervisord -c /etc/supervisor/conf.d
#也可以通过-c参数指定某一个配置 supervisord -c /etc/supervisor/conf.d
4.进程状态:
# 查看进程状态 supervisorctl status # 启动某个进程 supervisorctl start program-name # 停止进程 supervisorctl stop program-name # 重启某个进程 supervisorctl restart program-name
-
nohup
用于在后台运行进程,可以忽略终端断开信号,即使关闭终端也能让进程继续运行。比如某些临时任务,通过代码对资料进行备份 有时候用这个命令会比较方便,不需要写配置信息啥的 -
screen
当需要通过SSH等协议登录远程主机时,使用Screen可以保持会话的持久性,避免连接断开导致的中断
mac强制关机
sudo shutdown -h now
lsof
➜ /Users/wm lsof -i -n -P | grep LISTEN
程序名称 PID 用户 文件描述符 协议类型 内部地址/套接字 传输层协议和端口(状态)
rapportd 416 wm 3u IPv4 0x51159b8e7a7d4c91 0t0 TCP *:55151 (LISTEN)
rapportd 416 wm 4u IPv6 0x51159b981908cb59 0t0 TCP *:55151 (LISTEN)
ControlCe 521 wm 5u IPv4 0x51159b8e7ce42051 0t0 TCP *:7000 (LISTEN)
ControlCe 521 wm 6u IPv6 0x51159b9818c64359 0t0 TCP *:7000 (LISTEN)
ControlCe 521 wm 7u IPv4 0x51159b8e7ce43671 0t0 TCP *:5000 (LISTEN)
ControlCe 521 wm 8u IPv6 0x51159b9818c61359 0t0 TCP *:5000 (LISTEN)
PacketTun 17795 wm 14u IPv4 0x51159b8e7a67f8d1 0t0 TCP 192.168.1.3:1082 (LISTEN)
PacketTun 17795 wm 15u IPv4 0x51159b8e7a679541 0t0 TCP 127.0.0.1:1082 (LISTEN)
PacketTun 17795 wm 16u IPv6 0x51159b981908f359 0t0 TCP [::1]:1082 (LISTEN)
ssh 19366 wm 5u IPv6 0x51159b9819097b59 0t0 TCP [::1]:3306 (LISTEN)
ssh 19366 wm 6u IPv4 0x51159b8e7a7ff671 0t0 TCP 127.0.0.1:3306 (LISTEN)
webstorm 22134 wm 38u IPv6 0x51159b9819095359 0t0 TCP 127.0.0.1:63342 (LISTEN)
ps命令
ps(process status),主要用于显示当前系统中的进程信息。
ps aux
显示系统中所有用户的所有进程
a:显示所有用户的进程,而不仅仅是当前用户的。
u:显示进程的详细信息(例如,启动进程的用户,CPU 和内存使用情况等)。
x:显示没有控制终端的进程(如后台进程)。
ps -p [进程号]
显示指定进程 ID(PID)的进程信息
例如,ps -p 19366 会显示 PID 为 19366 的进程信息。