兰 亭 墨 苑
期货 · 量化 · AI · 终身学习
首页
归档
编辑文章
标题 *
URL 别名 *
内容 *
(支持 Markdown 格式)
# 常用 Linux 命令详解 挑几条你日常最可能用到的,讲透用法和"什么时候用"。 --- ## 一、`find` — 按条件找文件 **核心**:按名字、时间、大小、权限、类型找文件,还能对结果执行命令。 ```bash # 按名字(不区分大小写) find /path -iname "*.log" # 按修改时间:7 天内 find /path -mtime -7 # 按大小:大于 100M find /path -size +100M # 组合:找 .py 文件并删除(危险,先看再删) find /path -name "*.py" -type f # 先列出 find /path -name "*.py" -type f -delete # 再删 # 对结果执行命令(-exec,{} 是占位符,\; 结束) find /path -name "*.log" -exec gzip {} \; # 更高效:+ 代替 \;,批量传给命令 find /path -name "*.log" -exec rm {} + ``` **关键点**: - `-mtime -7` = 7 天内修改过;`+7` = 7 天前修改过 - `-exec ... {} +` 比 `\;` 快(一次传多个文件) - **删之前先跑一遍不带 `-delete` 的**,确认结果对 --- ## 二、`grep` — 搜文本内容 **核心**:在文件里搜字符串,支持正则。 ```bash # 基本搜索 grep "error" app.log # 递归搜目录 grep -r "TODO" ./src # 显示行号 + 文件名 grep -rn "error" ./logs # 不区分大小写 grep -i "error" app.log # 反向:不含 error 的行 grep -v "error" app.log # 正则(-E 扩展正则) grep -E "error|warning" app.log # 搜二进制文件(编译型程序里找特征串) grep -a "Reply exactly" ./binary ``` **你踩过的坑**(来自 wxwatcher 排查日志): - **`grep -I`(大写 i)会跳过二进制**——搜编译型程序要带 `-a`/`--text` - **zsh 里 `grep -r "*.py"` 会被 glob 展开报错**——用 `--include='*.py'` 或加引号 ```bash grep -rn --include="*.py" "def main" ./src ``` --- ## 三、`awk` — 按列处理文本 **核心**:把每行按分隔符切成列,按列筛选、计算、格式化。 ```bash # 打印第 1、3 列(默认空格分隔) awk '{print $1, $3}' file.txt # 指定分隔符(逗号) awk -F',' '{print $1, $2}' data.csv # 按条件筛选(第 2 列 > 100) awk '$2 > 100 {print $0}' data.txt # 求和(第 3 列) awk '{sum += $3} END {print sum}' data.txt # 统计去重(第 1 列出现的次数) awk '{count[$1]++} END {for (k in count) print k, count[k]}' file.txt # 打印行号 + 内容 awk '{print NR": "$0}' file.txt ``` **典型场景**:日志分析、CSV 处理、字段提取。 ```bash # 从 access.log 提取访问量 top 10 的 IP awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10 ``` --- ## 四、`sed` — 流式替换/编辑 **核心**:不改原文件,对文本流做替换、删除、插入。 ```bash # 替换(只输出,不改原文件) sed 's/old/new/' file.txt # 全局替换(g) sed 's/old/new/g' file.txt # 直接改文件(-i,macOS 要加 '') sed -i '' 's/old/new/g' file.txt # macOS sed -i 's/old/new/g' file.txt # Linux # 删除空行 sed '/^$/d' file.txt # 删除含某字符串的行 sed '/debug/d' file.txt # 只打印第 10-20 行 sed -n '10,20p' file.txt # 正则替换(用 & 保留匹配内容) sed 's/error/【&】/g' file.txt # 给 error 加括号 ``` **关键点**: - **macOS 的 `sed -i` 必须跟一个参数**(`-i ''`),Linux 不用——**这是跨平台最常见的坑** - `s///g` 的 `g` 是"全局",不加只替换每行第一处 --- ## 五、`xargs` — 把输出变成参数 **核心**:把"一行行输出"变成"命令的参数",常和 `find`/`grep` 配合。 ```bash # 把 find 结果传给 rm find /path -name "*.tmp" | xargs rm # 处理含空格的文件名(-0 + find -print0) find /path -name "*.tmp" -print0 | xargs -0 rm # 每条命令最多传 N 个参数 find . -name "*.log" | xargs -n 1 gzip # 用 -I 占位符,灵活嵌入 cat urls.txt | xargs -I {} curl -O {} # 并行执行(-P,加速大批量处理) find . -name "*.jpg" | xargs -P 8 -I {} convert {} -resize 50% {} ``` **关键点**: - **文件名含空格时,必须 `-print0` + `xargs -0`**——否则会被拆成多个参数 - `-P 8` = 8 个并行进程,批量任务提速利器 --- ## 六、`ss` / `lsof` — 看端口和连接 **核心**:查"谁在监听哪个端口""谁连着谁"。 ```bash # 看监听端口(-t TCP,-n 数字,-p 显示进程) ss -tlnp # 看某端口的连接 ss -tnp | grep :8082 # lsof:看端口被谁占用 lsof -nP -i :8082 # 看某进程打开的文件 lsof -p <pid> # 看某文件被谁占用 lsof /path/to/file ``` **你排查时的实际用法**(ZOLTRAAK 事件): ```bash # 1 秒轮询,抓客户端 PID while :; do lsof -nP -i TCP:8082 | grep -v LISTEN; sleep 1; done ``` --- ## 七、`tcpdump` — 抓包 **核心**:抓网络流量,看请求明文。 ```bash # 抓某端口(-A ASCII 模式,直接看 HTTP 明文) tcpdump -i any -n -s0 -A -l "tcp port 8082" # 抓某 IP tcpdump -i any -n host 31.77.203.199 # 抓回环(本机内部通信) tcpdump -i lo -n -s0 -A -l "tcp port 9090" # 存文件,事后用 wireshark 分析 tcpdump -i any -w capture.pcap "tcp port 80" ``` **你踩过的坑**: - **SSH 会话结束会杀后台 tcpdump**——用 `setsid` 脱离: ```bash setsid sh -c "tcpdump ... > /tmp/p.txt 2>&1" < /dev/null > /dev/null 2>&1 & ``` - **`pkill -f tcpdump` 会杀掉自己**(命令行本身含 "tcpdump" 字符串)——改按进程名精确匹配 --- ## 八、`systemctl` — 服务管理 **核心**:管理 systemd 服务(启动/停止/看状态/看日志)。 ```bash systemctl status sshd # 看状态 systemctl start/stop/restart # 启停重启 systemctl reload nginx # 热重载(不改进程) systemctl enable/disable # 开机自启 systemctl list-units --failed # 看哪些服务挂了 # 看日志(最常用) journalctl -u sshd -f # 实时跟踪 journalctl -u sshd --since "1 hour ago" journalctl -u sshd -n 100 # 最近 100 行 ``` --- ## 九、`chmod` / `chown` — 权限 ```bash # 数字法:4=读 2=写 1=执行 chmod 755 script.sh # rwxr-xr-x chmod 644 file.txt # rw-r--r-- chmod 600 key.txt # rw-------(私钥用这个) # 符号法 chmod +x script.sh # 加执行 chmod -R 755 dir/ # 递归 # 改属主 chown user:group file chown -R user:group dir/ ``` **关键点**:**私钥、密钥文件一律 600**——你 ZOLTRAAK 那份 `api网关密钥.txt` 就是 0600,这是对的。 --- ## 十、`df` / `du` — 磁盘 ```bash df -h # 各分区使用率 df -h /path # 某路径所在分区 du -sh /path # 目录总大小 du -sh * | sort -rh # 当前目录下各项大小,降序 du -h --max-depth=1 /path # 一层层看 ``` **排查磁盘满的标准动作**: ```bash df -h # 先看哪个分区满 du -sh /* 2>/dev/null | sort -rh | head # 逐层定位 ``` --- ## 组合技:几个实用管道 ```bash # 1. 找最大的 10 个文件 find / -type f -size +100M 2>/dev/null | xargs du -sh | sort -rh | head # 2. 统计日志里 top 10 IP awk '{print $1}' access.log | sort | uniq -c | sort -rn | head # 3. 批量替换目录下所有文件的字符串 grep -rl "old" ./src | xargs sed -i 's/old/new/g' # 4. 实时看某进程日志里的错误 tail -f app.log | grep --line-buffered "ERROR" # 5. 找出监听端口对应的进程 ss -tlnp | awk 'NR>1 {print $4, $6}' ```
配图 (可多选)
选择新图片文件或拖拽到此处
标签
更新文章
删除文章