IP地址检测
视频播放器
输入关键词搜索
登录
Linux和Mac常用命令

Linux和Mac常用命令

2023-02-20
编程开发

管道符 |

在 Unix/Linux 系统中,|(管道符)是一个非常重要的符号,用于将一个命令的输出作为另一个命令的输入。它避免了中间结果的临时存储,不需要手动保存中间文件,节省了磁盘 IO,从而提高了效率和便捷性

基本语法

command1 | command2 | command3 ...
  • command1的输出将成为command2的输入。
  • command2的输出将成为command3的输入,依此类推。

可以用多个 | 符号串联多个命令,形成复杂的处理流程。例如:

ps aux | grep "apache" | awk '{print $2}' | xargs kill -9
  1. 列出所有进程。
  2. 筛选出包含 “apache” 的进程。
  3. 提取进程 ID。
  4. 终止这些进程。

注意事项

  1. 管道符号的作用基于文本流。因此,如果命令输出不是标准文本(如二进制数据),需要使用合适的工具进行处理。
  2. 如果数据量非常大,管道可能会成为性能瓶颈,此时可以考虑使用文件缓存或更高效的工具。
  3. 管道仅传递标准输出(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 上一条执行的命令,如lsgrepfind
  • 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_logfilestdout_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 的进程信息。

THE END
0/500
暂无评论
📢网站公告
欢迎来到这里
⚙️实用工具
html转pdfmarkdown编辑器
本站推荐:腾讯云服务器仅需2.3折 (点击直达)
用户协议
隐私政策
Build Time: 2025-04-26 11:07:00