欢迎光临
我们一直在努力

Linux基础命令:文件、用户、权限一网打尽

Linux基础命令:文件、用户、权限一网打尽

前几天发布的从零玩转 Linux 命令行:一位后端菜鸟的硬核笔记 深受大家喜欢,今天我再发一个简洁版的博客,方便大家速查


一、文件查看与检索

1.1 正则表达式:文本处理的基础

在讲文本搜索之前,必须先说说正则表达式。它是文本处理的灵魂,grep、sed、awk都依赖它来做模式匹配。

基础正则

# . 匹配任意单个字符
grep "h.llo" file.txt # 匹配 hello, hallo, hxllo 等

# * 匹配前面的字符0次或多次
grep "ab*c" file.txt # 匹配 ac, abc, abbc, abbbc 等

# ^ 行首锚定
grep "^root" /etc/passwd # 匹配以root开头的行

# $ 行尾锚定
grep "bash$" /etc/passwd # 匹配以bash结尾的行

# ^$ 匹配空行
grep -n "^$" file.txt # 显示空行及行号

# [] 匹配括号中的任意一个字符
grep "[0-9]" file.txt # 匹配包含数字的行
grep "[a-zA-Z]" file.txt # 匹配包含字母的行

# [^] 匹配不在括号中的字符
grep "[^0-9]" file.txt # 匹配包含非数字的行

# \\b 单词边界
grep "\\bword\\b" file.txt # 精确匹配单词word

扩展正则(ERE)

使用grep -E(或egrep)启用扩展正则:

# + 匹配前面的字符1次或多次
grep -E "ab+c" file.txt # 匹配 abc, abbc(不匹配ac)

# ? 匹配前面的字符0次或1次
grep -E "ab?c" file.txt # 匹配 ac, abc(不匹配abbc)

# {n} 匹配n次
grep -E "[0-9]{3}" file.txt # 匹配连续3个数字

# {n,m} 匹配n到m次
grep -E "[0-9]{2,4}" file.txt # 匹配2到4个数字

# | 或运算
grep -E "cat|dog" file.txt # 匹配cat或dog

# () 分组
grep -E "(ab)+" file.txt # 匹配ab, abab, ababab 等

预定义字符类

[[:alnum:]] # 字母和数字(等同于[a-zA-Z0-9])
[[:alpha:]] # 字母(等同于[a-zA-Z])
[[:digit:]] # 数字(等同于[0-9])
[[:lower:]] # 小写字母
[[:upper:]] # 大写字母
[[:space:]] # 空白字符
[[:punct:]] # 标点符号

实战:验证IP地址格式

#!/bin/bash
# 验证IP地址格式是否正确

ip="$1"
if [[ $ip =~ ^([0-9]{1,3}\\.){3}[0-9]{1,3}$ ]]; then
echo "格式正确"
else
echo "格式错误"
fi

1.2 grep:在海量日志中精准定位你要的内容

做过线上排查的同学一定对grep不陌生。服务报错了,第一反应就是去日志里grep一下错误关键字。但grep的能力远不止于此。

grep(Global Regular Expression Print)是最常用的文本搜索命令,支持正则表达式进行模式匹配。

常用选项速查

# -i 忽略大小写
grep -i "error" /var/log/app.log

# -v 反向匹配(显示不匹配的行)
grep -v "^#" /etc/nginx/nginx.conf | grep -v "^$" # 过滤注释和空行

# -c 统计匹配行数
grep -c "404" access.log

# -l 只显示包含匹配的文件名
grep -rl "TODO" ./src/

# -n 显示行号
grep -n "NullPointerException" app.log

# -w 精确匹配整个单词
grep -w "error" app.log

# -A/-B/-C 显示上下文
grep -C 3 "NullPointerException" app.log # 前后各3行

-A、-B、-C三个参数分别代表After(后几行)、Before(前几行)、Context(前后各几行),在排查问题时配合使用效果拔群。

进阶用法

# 递归搜索整个目录下的所有文件
grep -r "TODO" ./src/

# 只显示匹配到的文件名(快速定位哪个文件有问题)
grep -l "deprecated" ./src/**/*.java

# 反向匹配:显示不包含指定内容的行(过滤注释和空行)
grep -v "^#" /etc/nginx/nginx.conf | grep -v "^$"

# 使用正则匹配以"Error"开头的行
grep "^Error" app.log

# 统计匹配到的次数
grep -c "Timeout" app.log

# 使用扩展正则
grep -E "cat|dog" file.txt

实战场景

# 场景1:查找日志中的异常并统计
grep -c "OutOfMemoryError" app.log

# 场景2:查看配置文件中生效的配置(过滤注释和空行)
grep -E -v "^(#|$)" /etc/nginx/nginx.conf

# 场景3:查找包含特定方法的Java源文件
grep -rl "public void handle" –include="*.java" ./src/

# 场景4:查找最近100行日志中的ERROR
tail -100 app.log | grep "ERROR"

1.3 find:不只是找文件那么简单

find命令的功能非常强大,它可以在指定目录下按照各种条件搜索文件。

# 按文件名查找
find /var/log -name "*.log"

# 按文件类型查找(f=普通文件,d=目录)
find /tmp -type f -name "*.tmp"

# 按大小查找(查找大于100M的日志文件)
find /var/log -size +100M

# 按修改时间查找(查找7天内修改过的配置文件)
find /etc -name "*.conf" -mtime -7

# 找到文件后执行操作(删除超过30天的日志)
find /var/log -name "*.log" -mtime +30 -exec rm -f {} \\;

1.4 wc、sort、uniq:文本统计三剑客

在做数据分析或者日志统计时,这几个命令经常组合使用。

# wc统计行数、单词数、字符数
wc -l /etc/passwd # 统计文件行数
cat app.log | wc -l # 统计日志行数

# sort排序
sort -n numbers.txt # 按数字升序排列
sort -r numbers.txt # 降序排列
sort -u numbers.txt # 排序并去重

# uniq去重(注意:uniq只能去除相邻的重复行,所以一般要先sort)
sort names.txt | uniq # 排序后去重
sort names.txt | uniq -c # 去重并统计每行出现次数
sort names.txt | uniq -d # 只显示重复的行

实战场景:统计Nginx访问日志中访问次数最多的IP

awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10

这条管道命令的逻辑是:提取IP字段 → 排序 → 去重计数 → 按次数降序 → 取前10。简洁高效。


二、用户与权限管理

2.1 用户管理基础

Linux是一个多用户操作系统,用户管理是运维的基本功。

# 创建用户
useradd -m -s /bin/bash devuser # -m创建家目录,-s指定shell

# 设置密码
passwd devuser

# 删除用户(-r同时删除家目录)
userdel -r devuser

# 查看用户信息
id devuser # 查看uid、gid、所属组
whoami # 查看当前用户
who # 查看当前登录的所有用户

2.2 文件权限:rwx不是随便写的

Linux的权限模型是安全的基础。每个文件都有三组权限:所属用户(owner)、所属组(group)、其他人(others)。

# 查看文件权限
ls -la /etc/passwd
# -rw-r–r– 1 root root 2345 Jun 7 10:00 /etc/passwd
# 解读:所属用户rw-,所属组r–,其他人r–

# 修改权限(数字方式)
chmod 755 script.sh # rwxr-xr-x(用户7=rwx,组5=r-x,其他5=r-x)
chmod 644 config.yml # rw-r–r–

# 修改权限(符号方式)
chmod u+x script.sh # 给所属用户添加执行权限
chmod g-w file.txt # 去掉所属组的写权限
chmod o= file.txt # 去掉其他人的所有权限

# 修改所属用户和组
chown devuser:devgroup app.log
chown -R devuser:devgroup /opt/app/ # 递归修改目录

权限数字速记: r=4, w=2, x=1,三者相加就是权限数字。比如755就是rwxr-xr-x,644就是rw-r–r–。

2.3 umask:新文件的默认权限从哪来

你有没有想过,为什么新建的文件权限是644,新建的目录权限是755?这背后就是umask在起作用。

# 查看当前umask值
umask
# 输出:0022

# umask的计算规则:
# 文件默认权限 = 666 – umask = 666 – 022 = 644
# 目录默认权限 = 777 – umask = 777 – 022 = 755


三、文件类型与压缩

3.1 Linux中的文件类型

Linux中一切皆文件,但文件也分类型:

# 查看文件类型
ls -la
# 第一个字符标识文件类型:
# – 普通文件 d 目录 l 链接文件 s socket文件 c 字符设备 b 块设备

file myfile.txt # 更详细地查看文件类型

3.2 压缩与解压缩

线上部署经常要打包传输文件,压缩命令是必备技能。

# tar打包压缩(最常用)
tar -czf app.tar.gz /opt/app/ # 打包并gzip压缩
tar -cjf app.tar.bz2 /opt/app/ # 打包并bzip2压缩
tar -xf app.tar.gz # 解压(自动识别格式)
tar -xzf app.tar.gz -C /opt/ # 解压到指定目录

# 查看压缩包内容(不解压)
tar -tzf app.tar.gz

# zip格式(和Windows交互时常用)
zip -r app.zip /opt/app/
unzip app.zip -d /opt/

实用技巧: 排除某些文件不打包

# 排除日志和临时文件
tar -czf app.tar.gz –exclude="*.log" –exclude="*.tmp" /opt/app/


四、磁盘与进程

4.1 磁盘空间管理

磁盘满了是线上常见的告警之一,这几个命令要熟练掌握。

# 查看磁盘使用情况
df -h # 以人类可读的格式显示
df -hT # 多显示文件系统类型

# 查看目录大小
du -sh /var/log/ # 查看目录总大小
du -sh /var/log/* # 查看子目录各自大小
du -sh /var/log/ | sort -rh | head -10 # 找出最大的目录

4.2 进程管理

# 查看进程
ps aux | grep java # 查找Java进程
ps -ef | grep nginx # 另一种写法

# 实时查看系统资源
top # 实时监控CPU、内存
htop # 更好看的top(需要安装)

# 杀死进程
kill PID # 优雅终止
kill -9 PID # 强制杀死(慎用)

# 后台运行
nohup java -jar app.jar > app.log 2>&1 &


五、网络相关命令

5.1 网络连通性测试

# 测试网络连通性
ping -c 4 baidu.com # 只ping 4次

# 查看路由
traceroute baidu.com

# DNS解析
nslookup baidu.com
dig baidu.com

5.2 端口与连接

# 查看端口占用
netstat -tlnp # 查看所有监听端口
ss -tlnp # 更现代的写法

# 查看特定端口
ss -tlnp | grep :8080

# 查看网络连接状态统计
ss -ant | awk '{print $1}' | sort | uniq -c | sort -rn

5.3 curl与wget

# 测试HTTP接口
curl -s -o /dev/null -w "%{http_code}" http://localhost:8080/health
curl -X POST -H "Content-Type: application/json" -d '{"key":"value"}' http://api.example.com

# 下载文件
wget https://example.com/file.tar.gz
wget -c https://example.com/large.iso # 断点续传


六、sed:流编辑器

sed(Stream Editor)是一个强大的流式文本编辑工具。它逐行读取文件,对匹配的行执行指定操作,然后输出结果。

6.1 工作原理

文件 → 逐行读入模式空间 → 执行命令 → 输出结果 → 清空模式空间 → 读下一行

6.2 基本语法

sed [选项] '命令' 文件名

# 常用选项:
# -n 静默模式,只输出被处理的行
# -i 直接修改文件(不加-i只预览不修改)
# -E 使用扩展正则
# -e 执行多条命令

6.3 打印(p)

# 打印第2行
sed -n '2p' file.txt

# 打印第2到5行
sed -n '2,5p' file.txt

# 打印包含关键字的行
sed -n '/ERROR/p' app.log

# 打印奇数行/偶数行
sed -n '1~2p' file.txt # 奇数行
sed -n '0~2p' file.txt # 偶数行

6.4 删除(d)

# 删除第3行
sed '3d' file.txt

# 删除空行
sed '/^$/d' file.txt

# 删除注释行
sed '/^#/d' file.txt

# 删除注释行和空行
sed -e '/^#/d' -e '/^$/d' file.txt

# 直接修改文件(加-i)
sed -i '/^#/d' file.txt

6.5 替换(s)

这是sed最常用的功能:

# 基本替换:替换每行第一个匹配
sed 's/old/new/' file.txt

# 全局替换:替换所有匹配
sed 's/old/new/g' file.txt

# 直接修改文件
sed -i 's/old/new/g' file.txt

# 指定行替换
sed '3s/old/new/' file.txt # 只替换第3行
sed '3,5s/old/new/g' file.txt # 替换第3到5行

# 使用不同的分隔符(处理路径时很有用)
sed 's#/usr/local#/opt#g' file.txt

# 备份原文件再修改
sed -i.bak 's/old/new/g' file.txt # 原文件备份为file.txt.bak

实战:获取IP地址

# 从ifconfig输出中提取IP(分组提取)
ifconfig eth0 | sed -nr 's/.*inet ([0-9.]+).*/\\1/p'

6.6 插入和追加

# 在第3行前插入
sed '3i\\新内容' file.txt

# 在第3行后追加
sed '3a\\新内容' file.txt

# 在匹配行后追加
sed '/server/a\\ listen 443 ssl;' nginx.conf

# 在文件末尾追加
sed '$a\\新增的最后一行' file.txt

6.7 实战:批量修改配置文件

#!/bin/bash
# 批量修改Nginx配置

CONF="/etc/nginx/nginx.conf"

# 修改端口号
sed -i 's/listen 80/listen 8080/' "$CONF"

# 修改server_name
sed -i 's/server_name localhost/server_name www.example.com/' "$CONF"

# 在http块中添加配置
sed -i '/http {/a\\ client_max_body_size 100m;' "$CONF"

# 删除空行
sed -i '/^$/d' "$CONF"

echo "配置修改完成"


七、awk:文本分析利器

awk是三剑客中最强大的,它不仅能过滤和提取,还能做数学运算和格式化输出。如果说grep是查找,sed是编辑,那awk就是分析。

7.1 基本语法

awk 'pattern {action}' file
awk -F '分隔符' 'pattern {action}' file

7.2 字段提取

awk最核心的能力是按列提取数据:

# 提取第1列和第3列
awk '{print $1, $3}' file.txt

# 指定分隔符(默认是空格)
awk -F ':' '{print $1, $7}' /etc/passwd

# $0表示整行,$NF表示最后一列
awk -F ':' '{print $1, $NF}' /etc/passwd

# $(NF-1)表示倒数第二列
awk '{print $(NF-1)}' file.txt

7.3 内置变量

变量含义
NR 当前行号
NF 当前行的字段数
FS 输入字段分隔符
OFS 输出字段分隔符
FILENAME 当前文件名
$0 整行内容
$n 第n个字段

# NR:行号
awk '{print NR, $0}' file.txt

# NF:字段数
awk '{print NF}' file.txt

# 输出分隔符
awk -F ':' -v OFS="," '{print $1, $3, $7}' /etc/passwd

7.4 BEGIN和END

# BEGIN:处理数据前执行
# END:处理数据后执行

awk -F ':' 'BEGIN{print "用户名\\tUID\\tShell"} {print $1"\\t"$3"\\t"$7} END{print "—完毕—"}' /etc/passwd

实战:格式化输出成绩表

#!/bin/bash

cat << 'EOF' > scores.txt
姓名 语文 数学 英语
张三 85 90 78
李四 92 88 95
王五 76 82 80
赵六 88 95 92
EOF

awk 'BEGIN{
printf "===================================\\n"
printf "|%-4s|%4s|%4s|%4s|%5s|\\n","姓名","语文","数学","英语","总分"
printf "===================================\\n"
}
NR>=2{
total=$2+$3+$4
printf "|%-4s|%4d|%4d|%4d|%5d|\\n",$1,$2,$3,$4,total
yu+=$2; shu+=$3; ying+=$4
}
END{
printf "===================================\\n"
printf "|合计|%4d|%4d|%4d|\\n",yu,shu,ying
printf "===================================\\n"
}'
scores.txt

7.5 条件与循环

# 条件判断
awk -F ':' '$3 >= 1000 {print $1, $3}' /etc/passwd # UID>=1000的用户

# if语句
awk -F ':' '{if($3>=1000) print $1, "普通用户"; else print $1, "系统用户"}' /etc/passwd

# for循环
awk '{sum=0; for(i=2;i<=NF;i++) sum+=$i; print $1, sum}' scores.txt

# 数组统计
awk '{count[$1]++} END{for(k in count) print k, count[k]}' access.log

7.6 内置函数

# 字符串长度
awk 'BEGIN{print length("hello")}'

# 字符串截取
awk 'BEGIN{print substr("hello world", 1, 5)}'

# 大小写转换
awk 'BEGIN{s="Hello"; print toupper(s), tolower(s)}'

# 数学函数
awk 'BEGIN{print sqrt(144)}' # 12
awk 'BEGIN{print int(3.7)}' # 3

7.7 实战案例

统计Nginx日志中每个IP的访问次数:

awk '{ip[$1]++} END{for(k in ip) print k, ip[k]}' access.log | sort -k2 -rn | head -10

统计HTTP状态码分布:

awk '{status[$9]++} END{for(k in status) print k, status[k]}' access.log | sort -k2 -rn

找出响应时间超过1秒的请求:

awk '$NF > 1.0 {print $0}' access.log

统计每天的访问量:

awk -F'[/:]' '{date=$2"-"$3"-"$4; count[date]++} END{for(d in count) print d, count[d]}' access.log | sort


八、三剑客组合实战

8.1 综合案例:Nginx日志分析报告

#!/bin/bash
# 功能:生成Nginx访问日志分析报告

LOG="${1:-/var/log/nginx/access.log}"

if [ ! -f "$LOG" ]; then
echo "日志文件不存在: $LOG"
exit 1
fi

echo "========================================"
echo " Nginx日志分析报告"
echo " 生成时间: $(date '+%F %T')"
echo " 日志文件: $LOG"
echo " 日志行数: $(wc -l < "$LOG")"
echo "========================================"

echo ""
echo "— 访问量TOP10的IP —"
awk '{print $1}' "$LOG" | sort | uniq -c | sort -rn | head -10

echo ""
echo "— HTTP状态码分布 —"
awk '{print $9}' "$LOG" | sort | uniq -c | sort -rn

echo ""
echo "— 访问量TOP10的URL —"
awk '{print $7}' "$LOG" | sort | uniq -c | sort -rn | head -10

echo ""
echo "— 每小时访问量 —"
awk -F'[/:]' '{print $2}' "$LOG" | sort | uniq -c | sort -k2n

echo ""
echo "— 4xx/5xx错误请求 —"
awk '$9 ~ /^[45]/ {print $9, $7}' "$LOG" | sort | uniq -c | sort -rn | head -10

echo "========================================"

8.2 综合案例:配置文件批量处理

#!/bin/bash
# 功能:批量处理应用配置文件

# 提取配置文件中的有效行(过滤注释和空行)
grep -E -v "^(#|$)" application.yml

# 替换数据库连接字符串
sed -i 's/localhost:3306/db-server:3306/g' application.yml

# 提取所有配置项的key
awk -F ':' '/^[^#]/{print $1}' application.yml | tr -d ' '

# 统计每个环境的配置数量
grep -c "dev\\|test\\|prod" application.yml

8.3 综合案例:服务器巡检脚本

#!/bin/bash
# 功能:服务器巡检

echo "========== 服务器巡检报告 =========="
echo "巡检时间: $(date '+%F %T')"
echo ""

# CPU使用率
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}')
echo "CPU使用率: ${cpu_usage}%"

# 内存使用率
mem_info=$(free -m | awk '/Mem/{printf "%d/%dM (%.1f%%)", $3, $2, $3/$2*100}')
echo "内存使用: $mem_info"

# 磁盘使用率
echo "磁盘使用:"
df -h | awk '/^\\/dev/{printf " %-20s %s\\n", $6, $5}'

# 系统负载
load=$(uptime | awk -F'load average:' '{print $2}')
echo "系统负载:$load"

# TCP连接状态
echo "TCP连接状态:"
ss -ant | awk 'NR>1{state[$1]++} END{for(s in state) printf " %-15s %d\\n", s, state[s]}'

# 最近登录失败记录
echo "最近登录失败:"
lastb 2>/dev/null | head -5 || echo " 无权限查看"

echo ""
echo "====================================="


九、实用技巧速查

日常开发中非常高频的命令组合:

# 查看Java进程的线程数
ps -eLf | grep java | wc -l

# 实时查看日志最新100行
tail -f -n 100 /var/log/app.log

# 统计文件中每个单词出现的次数
cat file.txt | tr ' ' '\\n' | sort | uniq -c | sort -rn

# 批量替换文件中的字符串
sed -i 's/old_value/new_value/g' config.yml

# 查找并杀死所有匹配的进程
ps aux | grep "app.jar" | grep -v grep | awk '{print $2}' | xargs kill -9

# 统计日志中关键字的出现次数
grep -c "ERROR" app.log

# 从日志中提取特定字段并排序统计
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10

# 递归替换目录下所有文件中的字符串
find ./src -type f -name "*.java" -exec sed -i 's/OldClass/NewClass/g' {} \\;


赞(0)
未经允许不得转载:171主机测评 » Linux基础命令:文件、用户、权限一网打尽
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址