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

发布时间:2026/6/11 6:08:57

Linux基础命令:文件、用户、权限一网打尽 Linux基础命令文件、用户、权限一网打尽前几天发布的从零玩转 Linux 命令行一位后端菜鸟的硬核笔记 深受大家喜欢今天我再发一个简洁版的博客方便大家速查一、文件查看与检索1.1 正则表达式文本处理的基础在讲文本搜索之前必须先说说正则表达式。它是文本处理的灵魂grep、sed、awk都依赖它来做模式匹配。基础正则# . 匹配任意单个字符greph.llofile.txt# 匹配 hello, hallo, hxllo 等# * 匹配前面的字符0次或多次grepab*cfile.txt# 匹配 ac, abc, abbc, abbbc 等# ^ 行首锚定grep^root/etc/passwd# 匹配以root开头的行# $ 行尾锚定grepbash$/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\bfile.txt# 精确匹配单词word扩展正则ERE使用grep -E或egrep启用扩展正则# 匹配前面的字符1次或多次grep-Eabcfile.txt# 匹配 abc, abbc不匹配ac# ? 匹配前面的字符0次或1次grep-Eab?cfile.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-Ecat|dogfile.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$1if[[$ip~^([0-9]{1,3}\.){3}[0-9]{1,3}$]];thenecho格式正确elseecho格式错误fi1.2 grep在海量日志中精准定位你要的内容做过线上排查的同学一定对grep不陌生。服务报错了第一反应就是去日志里grep一下错误关键字。但grep的能力远不止于此。grepGlobal Regular Expression Print是最常用的文本搜索命令支持正则表达式进行模式匹配。常用选项速查# -i 忽略大小写grep-ierror/var/log/app.log# -v 反向匹配显示不匹配的行grep-v^#/etc/nginx/nginx.conf|grep-v^$# 过滤注释和空行# -c 统计匹配行数grep-c404access.log# -l 只显示包含匹配的文件名grep-rlTODO./src/# -n 显示行号grep-nNullPointerExceptionapp.log# -w 精确匹配整个单词grep-werrorapp.log# -A/-B/-C 显示上下文grep-C3NullPointerExceptionapp.log# 前后各3行-A、-B、-C三个参数分别代表After后几行、Before前几行、Context前后各几行在排查问题时配合使用效果拔群。进阶用法# 递归搜索整个目录下的所有文件grep-rTODO./src/# 只显示匹配到的文件名快速定位哪个文件有问题grep-ldeprecated./src/**/*.java# 反向匹配显示不包含指定内容的行过滤注释和空行grep-v^#/etc/nginx/nginx.conf|grep-v^$# 使用正则匹配以Error开头的行grep^Errorapp.log# 统计匹配到的次数grep-cTimeoutapp.log# 使用扩展正则grep-Ecat|dogfile.txt实战场景# 场景1查找日志中的异常并统计grep-cOutOfMemoryErrorapp.log# 场景2查看配置文件中生效的配置过滤注释和空行grep-E-v^(#|$)/etc/nginx/nginx.conf# 场景3查找包含特定方法的Java源文件grep-rlpublic void handle--include*.java./src/# 场景4查找最近100行日志中的ERRORtail-100app.log|grepERROR1.3 find不只是找文件那么简单find命令的功能非常强大它可以在指定目录下按照各种条件搜索文件。# 按文件名查找find/var/log-name*.log# 按文件类型查找f普通文件d目录find/tmp-typef-name*.tmp# 按大小查找查找大于100M的日志文件find/var/log-size100M# 按修改时间查找查找7天内修改过的配置文件find/etc-name*.conf-mtime-7# 找到文件后执行操作删除超过30天的日志find/var/log-name*.log-mtime30-execrm-f{}\;1.4 wc、sort、uniq文本统计三剑客在做数据分析或者日志统计时这几个命令经常组合使用。# wc统计行数、单词数、字符数wc-l/etc/passwd# 统计文件行数catapp.log|wc-l# 统计日志行数# sort排序sort-nnumbers.txt# 按数字升序排列sort-rnumbers.txt# 降序排列sort-unumbers.txt# 排序并去重# uniq去重注意uniq只能去除相邻的重复行所以一般要先sortsortnames.txt|uniq# 排序后去重sortnames.txt|uniq-c# 去重并统计每行出现次数sortnames.txt|uniq-d# 只显示重复的行实战场景统计Nginx访问日志中访问次数最多的IPawk{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# 设置密码passwddevuser# 删除用户-r同时删除家目录userdel-rdevuser# 查看用户信息iddevuser# 查看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--# 修改权限数字方式chmod755script.sh# rwxr-xr-x用户7rwx组5r-x其他5r-xchmod644config.yml# rw-r--r--# 修改权限符号方式chmodux script.sh# 给所属用户添加执行权限chmodg-w file.txt# 去掉所属组的写权限chmodofile.txt# 去掉其他人的所有权限# 修改所属用户和组chowndevuser:devgroup app.logchown-Rdevuser:devgroup /opt/app/# 递归修改目录权限数字速记r4, w2, x1三者相加就是权限数字。比如755就是rwxr-xr-x644就是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 块设备filemyfile.txt# 更详细地查看文件类型3.2 压缩与解压缩线上部署经常要打包传输文件压缩命令是必备技能。# tar打包压缩最常用tar-czfapp.tar.gz /opt/app/# 打包并gzip压缩tar-cjfapp.tar.bz2 /opt/app/# 打包并bzip2压缩tar-xfapp.tar.gz# 解压自动识别格式tar-xzfapp.tar.gz-C/opt/# 解压到指定目录# 查看压缩包内容不解压tar-tzfapp.tar.gz# zip格式和Windows交互时常用zip-rapp.zip /opt/app/unzipapp.zip-d/opt/实用技巧排除某些文件不打包# 排除日志和临时文件tar-czfapp.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 进程管理# 查看进程psaux|grepjava# 查找Java进程ps-ef|grepnginx# 另一种写法# 实时查看系统资源top# 实时监控CPU、内存htop# 更好看的top需要安装# 杀死进程killPID# 优雅终止kill-9PID# 强制杀死慎用# 后台运行nohupjava-jarapp.jarapp.log21五、网络相关命令5.1 网络连通性测试# 测试网络连通性ping-c4baidu.com# 只ping 4次# 查看路由traceroutebaidu.com# DNS解析nslookupbaidu.comdigbaidu.com5.2 端口与连接# 查看端口占用netstat-tlnp# 查看所有监听端口ss-tlnp# 更现代的写法# 查看特定端口ss-tlnp|grep:8080# 查看网络连接状态统计ss-ant|awk{print $1}|sort|uniq-c|sort-rn5.3 curl与wget# 测试HTTP接口curl-s-o/dev/null-w%{http_code}http://localhost:8080/healthcurl-XPOST-HContent-Type: application/json-d{key:value}http://api.example.com# 下载文件wgethttps://example.com/file.tar.gzwget-chttps://example.com/large.iso# 断点续传六、sed流编辑器sedStream Editor是一个强大的流式文本编辑工具。它逐行读取文件对匹配的行执行指定操作然后输出结果。6.1 工作原理文件 → 逐行读入模式空间 → 执行命令 → 输出结果 → 清空模式空间 → 读下一行6.2 基本语法sed[选项]命令文件名# 常用选项# -n 静默模式只输出被处理的行# -i 直接修改文件不加-i只预览不修改# -E 使用扩展正则# -e 执行多条命令6.3 打印p# 打印第2行sed-n2pfile.txt# 打印第2到5行sed-n2,5pfile.txt# 打印包含关键字的行sed-n/ERROR/papp.log# 打印奇数行/偶数行sed-n1~2pfile.txt# 奇数行sed-n0~2pfile.txt# 偶数行6.4 删除d# 删除第3行sed3dfile.txt# 删除空行sed/^$/dfile.txt# 删除注释行sed/^#/dfile.txt# 删除注释行和空行sed-e/^#/d-e/^$/dfile.txt# 直接修改文件加-ised-i/^#/dfile.txt6.5 替换s这是sed最常用的功能# 基本替换替换每行第一个匹配seds/old/new/file.txt# 全局替换替换所有匹配seds/old/new/gfile.txt# 直接修改文件sed-is/old/new/gfile.txt# 指定行替换sed3s/old/new/file.txt# 只替换第3行sed3,5s/old/new/gfile.txt# 替换第3到5行# 使用不同的分隔符处理路径时很有用seds#/usr/local#/opt#gfile.txt# 备份原文件再修改sed-i.baks/old/new/gfile.txt# 原文件备份为file.txt.bak实战获取IP地址# 从ifconfig输出中提取IP分组提取ifconfigeth0|sed-nrs/.*inet ([0-9.]).*/\1/p6.6 插入和追加# 在第3行前插入sed3i\新内容file.txt# 在第3行后追加sed3a\新内容file.txt# 在匹配行后追加sed/server/a\ listen 443 ssl;nginx.conf# 在文件末尾追加sed$a\新增的最后一行file.txt6.7 实战批量修改配置文件#!/bin/bash# 批量修改Nginx配置CONF/etc/nginx/nginx.conf# 修改端口号sed-is/listen 80/listen 8080/$CONF# 修改server_namesed-is/server_name localhost/server_name www.example.com/$CONF# 在http块中添加配置sed-i/http {/a\ client_max_body_size 100m;$CONF# 删除空行sed-i/^$/d$CONFecho配置修改完成七、awk文本分析利器awk是三剑客中最强大的它不仅能过滤和提取还能做数学运算和格式化输出。如果说grep是查找sed是编辑那awk就是分析。7.1 基本语法awkpattern {action}fileawk-F分隔符pattern {action}file7.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.txt7.3 内置变量变量含义NR当前行号NF当前行的字段数FS输入字段分隔符OFS输出字段分隔符FILENAME当前文件名$0整行内容$n第n个字段# NR行号awk{print NR, $0}file.txt# NF字段数awk{print NF}file.txt# 输出分隔符awk-F:-vOFS,{print $1, $3, $7}/etc/passwd7.4 BEGIN和END# BEGIN处理数据前执行# END处理数据后执行awk-F:BEGIN{print 用户名\tUID\tShell} {print $1\t$3\t$7} END{print ---完毕---}/etc/passwd实战格式化输出成绩表#!/bin/bashcatEOFscores.txt姓名 语文 数学 英语 张三 85 90 78 李四 92 88 95 王五 76 82 80 赵六 88 95 92 EOFawkBEGIN{ printf \n printf |%-4s|%4s|%4s|%4s|%5s|\n,姓名,语文,数学,英语,总分 printf \n } NR2{ 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.txt7.5 条件与循环# 条件判断awk-F:$3 1000 {print $1, $3}/etc/passwd# UID1000的用户# if语句awk-F:{if($31000) print $1, 普通用户; else print $1, 系统用户}/etc/passwd# for循环awk{sum0; for(i2;iNF;i) sum$i; print $1, sum}scores.txt# 数组统计awk{count[$1]} END{for(k in count) print k, count[k]}access.log7.6 内置函数# 字符串长度awkBEGIN{print length(hello)}# 字符串截取awkBEGIN{print substr(hello world, 1, 5)}# 大小写转换awkBEGIN{sHello; print toupper(s), tolower(s)}# 数学函数awkBEGIN{print sqrt(144)}# 12awkBEGIN{print int(3.7)}# 37.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];thenecho日志文件不存在:$LOGexit1fiechoecho Nginx日志分析报告echo 生成时间:$(date%F %T)echo 日志文件:$LOGecho 日志行数:$(wc-l$LOG)echoechoecho--- 访问量TOP10的IP ---awk{print $1}$LOG|sort|uniq-c|sort-rn|head-10echoecho--- HTTP状态码分布 ---awk{print $9}$LOG|sort|uniq-c|sort-rnechoecho--- 访问量TOP10的URL ---awk{print $7}$LOG|sort|uniq-c|sort-rn|head-10echoecho--- 每小时访问量 ---awk-F[/:]{print $2}$LOG|sort|uniq-c|sort-k2nechoecho--- 4xx/5xx错误请求 ---awk$9 ~ /^[45]/ {print $9, $7}$LOG|sort|uniq-c|sort-rn|head-10echo8.2 综合案例配置文件批量处理#!/bin/bash# 功能批量处理应用配置文件# 提取配置文件中的有效行过滤注释和空行grep-E-v^(#|$)application.yml# 替换数据库连接字符串sed-is/localhost:3306/db-server:3306/gapplication.yml# 提取所有配置项的keyawk-F:/^[^#]/{print $1}application.yml|tr-d # 统计每个环境的配置数量grep-cdev\|test\|prodapplication.yml8.3 综合案例服务器巡检脚本#!/bin/bash# 功能服务器巡检echo 服务器巡检报告 echo巡检时间:$(date%F %T)echo# CPU使用率cpu_usage$(top-bn1|grepCpu(s)|awk{print $2})echoCPU使用率:${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-Fload average:{print $2})echo系统负载:$load# TCP连接状态echoTCP连接状态:ss-ant|awkNR1{state[$1]} END{for(s in state) printf %-15s %d\n, s, state[s]}# 最近登录失败记录echo最近登录失败:lastb2/dev/null|head-5||echo 无权限查看echoecho九、实用技巧速查日常开发中非常高频的命令组合# 查看Java进程的线程数ps-eLf|grepjava|wc-l# 实时查看日志最新100行tail-f-n100/var/log/app.log# 统计文件中每个单词出现的次数catfile.txt|tr \n|sort|uniq-c|sort-rn# 批量替换文件中的字符串sed-is/old_value/new_value/gconfig.yml# 查找并杀死所有匹配的进程psaux|grepapp.jar|grep-vgrep|awk{print $2}|xargskill-9# 统计日志中关键字的出现次数grep-cERRORapp.log# 从日志中提取特定字段并排序统计awk{print $1}access.log|sort|uniq-c|sort-rn|head-10# 递归替换目录下所有文件中的字符串find./src-typef-name*.java-execsed-is/OldClass/NewClass/g{}\;

相关新闻