Linux
学习linux主要是在编程过程中偶尔要用到这些命令,使用linux来查询相对来说方便一些,自己经常忘记linux命令,查找不是很方便,所以记录下来
手册: 如果不知道命令都有什么参数,可以使用man 对应的命令来查询,比如man ls
一、文件与目录操作
| 命令 | 作用 | 常用示例/参数 |
|---|---|---|
ls | 列出目录内容 | -l(详情)-h(易读大小)-a(含隐藏文件) |
cd | 切换目录 | cd ~(返回家目录) |
pwd | 显示当前路径 | /Users/xxx/Desktop |
mkdir | 创建目录 | -p(递归创建父目录) |
rmdir | 删除空目录 | rmdir empty_dir |
touch | 创建空文件/更新时间戳 | touch file.txt |
rm | 删除文件/目录 | -r(递归删除目录)-f(强制删除) |
cp | 复制文件/目录 | -r(递归复制目录) |
mv | 移动/重命名文件 | mv old.txt new.txt |
ln | 创建链接 | -s(软链接)ln source link_name(硬链接) |
find | 查找文件 | find /path -name "*.txt"-type f(仅文件) |
file | 查看文件类型 | file image.png |
open | 打开文件/目录(GUI) | open .(当前目录) |
which | 查看命令安装路径 | which nginx(nginx的安装路径) |
1.2 ls - 查看当前文件夹
| 快捷键 | 含义 |
|---|---|
ls -l | 文件详情 |
ls -h | 文件大小,以字节显示 |
ls -2* | 搜索2开头的文件 |
ls -2? | 文件详情 |
1.3 ln - 软连接
- ln -s 文件名
- ln -s
ln -s 属于软连接快捷方式 ln 属于硬链接快捷键
1.4 find - 查找文件
| 符号 | 含义 |
|---|---|
| -name | 按照文件名查找文件find -name "*.txt" |
| -perm | 按照文件权限查找文件 |
| -mtime -n +n | 按照文件的更改时间查找文件,-n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在n天以前,find命令还有-atime和-ctime选项 |
| 类型 | 含义 |
|---|---|
| d | 目录 |
| b | 块设备文件 |
| c | 字符设备文件 |
| p | 管道文件 |
| l | 符号链接文件 |
| f | 普通文件 |
查找某个文件下面的字符串
find <directory> -type f -name "*.c" | xargs grep "<strings>"
<directory>是你要找的文件夹;如果是当前文件夹使用find $(pwd)-type f说明,只找文件-name "*.c"表示只找C语言写的代码,从而避免去查binary;也可以写"*",表示找所有文件<strings>是你要找的某个字符串
二、文件内容查看与处理
| 命令 | 作用 | 常用示例/参数 |
|---|---|---|
cat | 查看/合并文件 | cat file.txt>>(追加) |
grep | 文本搜索(支持正则) | -n(显示行号)-o "pattern"(仅匹配内容) |
head/tail | 查看文件开头/末尾 | -n 10(前10行) |
less/more | 分页查看文件 | less log.txt |
sort | 文件排序 | -r(逆序)-k 2(按第二列排序) |
uniq | 去重(需先排序) | -c(统计重复次数) |
wc | 统计行数/字数/字符数 | -l(行数) |
diff/cmp | 比较文件差异 | diff file1 file2 |
cut | 按列提取文本 | -d ',' -f 2(逗号分隔取第二列) |
sed | 流编辑器(替换/删除行等) | sed 's/old/new/g' file |
awk | 文本分析工具 | awk '{print $1}' file |
2.1 grep - 文本搜索工具
grep 是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来,grep 全称是 Global Regular Expression Print 表示全局正则表达式版本,使用权限是所有用户。
| 快捷键 | 含义 |
|---|---|
grep 'a' 1.txt | 查找a在1.txt的所有记录 |
grep -n 'a' 1.txt | 显示在多少行 |
grep '^a' 1.txt | 显示a开头的内容 |
| 参数 | 含义 |
|---|---|
| -c | 只输出匹配行的计数 |
| -i | 不区分大小写 |
| -h | 查询多文件时不显示文件名 |
| -l | 查询多文件时只输出包含匹配字符的文件名 |
| -n | 显示匹配行及行号 |
| -s | 不显示不存在或无匹配文本的错误信息 |
| -v | 显示不包含匹配文本的所有航 |
| --color=auto | 可以将找到的关键词部分加上颜色的延时 |
| -E | 使用扩展的正则表达式 |
| -o | 只显示跟查询匹配的部分 |
很多时候一行日志中有非常多的内容,我们往往只关心特定的部分,这个时候可以使用 grep 的正则来过滤出我们关心的部分,比如日志中的耗时我们可能会打印出 cost 10ms 这样的内容grep -o -P "cost [0-9]+ms"。-o 表示只输出匹配到的内容,每一行显示一个。-P "regex" 表示开启正则过滤
a$ 查找以a结尾的文件
因为Linux对文件后缀不敏感,所以不能想window一样考后缀等识别文件类型,也就是,linux下改变了文件的后缀名,仍然可以按它原来的样子执行。所以有查看文件类型的命令。
file 文件
参数:
- -b 只列出结果,不显示文件名称file -b 文件
- -f 批量显示多个文件的文件类型file -f 文件列表
- -F 更改显示的时候的分隔符,默认是':'。file -F "=="
- -L软链接指向的原始文件的类型file -L 软链接
2.2 sort - 从标准输入中读取数据
命令从标准输入中读取数据,然后安装字符串内容进行排序
| 符号 | 含义 |
|---|---|
| -f | 忽略字符大小写 |
| -n | 比较数值大小 |
| -t | 指定分隔符,默认是空格或者tab |
| -k | 指定分割后进行比较字段 |
| -u | 重复的行只显示一次 |
| -r | 反向排序 |
| -R | 打乱排序 |
2.3 uniq - 去除重复的行
去除重复的行,前提是重复的行是连续的
| 参数 | 含义 |
|---|---|
| -c | 显示每行重复的次数 |
| -d | 仅显示重复过的行 |
| -u | 仅显示不曾重复的行 |
2.4 wc 统计行数
| 参数 | 含义 |
|---|---|
| -l | 统计行数 |
| -c | 统计字节数 |
| -w | 统计单词数 |
2.5 xargs
xargs 的作用是将查找到的内容输出到一行,主要用来配合其他命令。比如查找对应的文件并移动到某个目录下 find . -name "*.txt" | xargs -I{} mv {} xxx/。-I{} 指定一个替换字符串作为参数替换。
2.6 sed - 以行为单位处理文本
sed以行为单位处理文本。
| 符号 | 含义 |
|---|---|
| -e | script允许多个脚本执行被执行 |
| p | print打印 |
| a | append追加 |
| i | insert插入 |
| d | delete删除 |
| s | substitution替换 |
2.7 comm 比较两个文件内容的差异
比较两个已排序文件的差异,并将其结果显示出来,如果没有指定任何参数,则会把结果分成 3 列显示:第 1 列仅是在第 1 个文件中出现过的列,第 2 列是仅在第 2 个文件中出现过的列,第 3 列则是在第 1 与第 2 个文件里都出现过的列。若给予的文件名称为 - ,则 comm 指令会从标准输入设备读取数据。
comm -3 file1 file2 #会打印出两个文件不同的地方三、权限与进程管理
| 命令 | 作用 | 常用示例/参数 |
|---|---|---|
chmod | 修改文件权限 | +x(添加执行权限) |
chown | 修改文件所有者 | chown user:group file |
ps | 查看进程 | -aux(所有进程) |
kill/killall | 终止进程 | kill -9 PIDkillall nginx |
top/htop | 动态查看进程资源占用 | top |
lsof | 系统级监控与诊断工具 | lsof [选项] [文件名/目录/进程ID/端口等] |
3.1 lsof 常用选项详解
| 选项 | 说明 | 示例 |
|---|---|---|
-a | 逻辑“与”,使多个筛选条件同时生效 | lsof -u root -a -i |
-c <进程名> | 显示指定进程名称(或其开头部分)打开的文件 | lsof -c nginx |
-p <PID> | 显示指定进程ID(PID)打开的所有文件 | lsof -p 1234 |
-u <用户名> | 显示指定用户启动的进程打开的文件 | lsof -u www-data |
-i | 显示所有网络连接(TCP/UDP套接字) | lsof -i |
-i:<端口> | 显示占用指定端口的进程 | lsof -i:8080 |
-i tcp | 显示所有TCP连接 | lsof -i tcp |
-d <FD> | 显示指定文件描述符(FD)的文件 | lsof -d 3 |
+d <目录> | 非递归显示指定目录下被打开的文件 | lsof +d /var/log |
+D <目录> | 递归显示指定目录及其子目录下被打开的文件 | lsof +D /usr/local |
-n | 不解析主机名,直接显示IP地址 | lsof -i -n |
-P | 不解析端口服务名,直接显示端口号 | lsof -i -P |
-t | 仅输出进程ID(PID),便于脚本处理 | kill -9 $(lsof -t -i:3000) |
四、压缩与归档
| 命令 | 作用 | 常用示例/参数 |
|---|---|---|
tar | 打包/解压 | -czvf archive.tar.gz dir(压缩)-xzvf(解压) |
zip/unzip | ZIP压缩/解压 | -r(递归压缩目录) |
gzip/gunzip | GZIP压缩/解压 | gzip file.txt |
五、网络与系统信息
| 命令 | 作用 | 常用示例/参数 |
|---|---|---|
ssh | 远程登录 | ssh user@host |
scp | 跨服务器传输文件 | -r(递归传输目录) |
ping | 测试网络连通性 | ping example.com |
ifconfig/ip | 查看网络接口信息 | ifconfig eth0 |
netstat | 查看网络连接 | -tuln(监听端口) |
df/du | 磁盘空间使用情况 | -h(易读格式) |
date | 显示/设置时间 | date "+%Y-%m-%d" |
who/w | 查看登录用户 | who |
last | 查看登录历史 | last -n 5 |
六、环境与脚本工具
| 命令 | 作用 | 常用示例/参数 |
|---|---|---|
export/env | 环境变量管理 | export PATH=$PATH:/new_path |
echo | 打印文本/变量 | echo $HOME |
type | 查看命令类型 | type -a ls |
pushd/popd | 目录栈跳转 | pushd /tmppopd |
crontab | 定时任务管理 | -e(编辑任务) |
script | 记录终端会话 | script session.log |
6.1 type - 显示指定命令的类型
-a:在环境变量PATH中查找并显示所有包含name的可执行文件路径;当'-p'选项没有同时给出时,如果在别名、关键字,函数,内建的信息中存在name,则一并显示。
-f:排除对shell函数的查找。
-p:如果name在执行'type -t name'返回的不是'file',那么什么也不返回;否则会在环境变量PATH中查找并返回可执行文件路径。
-P:即使要查找的name是别名、内建、函数中的一个,仍然会在环境变量PATH中查找并返回可执行文件路径。
-t:根据name的类型返回一个单词(别名,关键字,函数,内建,文件),否则返回空值。2
3
4
5
七、实用技巧补充
路径提取
bashdirname /path/to/file.txt # 输出:/path/to basename /path/to/file.txt # 输出:file.txt basename /path/to/file.txt # 输出:file1
2
3批量重命名
bashfor file in *.txt; do mv "$file" "prefix_$file"; done1快速搜索内容
bashgrep -rn "keyword" /path # 递归搜索目录中所有文件1查看命令帮助
bashman ls # 手册页 ls --help # 快速帮助1
2
八、按场景建议记忆
- 日常操作:
ls/cd/pwd/mkdir/cp/mv/rm - 日志分析:
cat/grep/head/tail/less/sed/awk - 文件处理:
find/xargs/sort/uniq/cut - 系统排查:
ps/top/df/du/netstat
参考文档
文件名获取
上面两个命令是shell提供的,难免有些限制,我们可以使用${}来灵活获取,而且${}可以用来做shell的字符子串提取。
var='/dir1/dir2/dir3/a.b.c.d'
echo ${var%%.*} #### 右起,找到最后一个'.'字符,返回开始到该字符的内容(不含'/')=> /dir1/dir2/dir3/a
echo ${var%/*} ## 右起,找到第一个'/'字符,返回开始到该字符的内容(不含'/')=> /dir1/dir2/dir3
echo ${var#*/} ## 左起,找到第一个'/'字符,返回其后面的内容(不含'/') => dir1/dir2/dir3/a.b.c.d
echo ${var##*/} ## 左起,找到最后一个'/'字符,返回其后面的内容(不含'/') => a.b.c.d2
3
4
5
对${}的总结:
#代表左起,%代表右起。两个符号代表最后一个字符,一个符号代表第一个字符#:左起第一个##: 左起最后一个%:右起第一个%%:右起最后一个
FILE="example.tar.gz"
echo "${FILE%%.*}" #取头 => example
echo "${FILE##*.}" #取尾 => gz
echo "${FILE#*.}" #去头 => tar.gz
echo "${FILE%.*}" #去尾 => example.tar
FILE="xxx/xx/example.tar.gz"
echo "${FILE%%.*}" #取头 => xxx/xx/example
echo "${FILE##*.}" #取尾 => gz
echo "${FILE#*.}" #去头 => tar.gz
echo "${FILE%.*}" #去尾 => xxx/xx/example.tar2
3
4
5
6
7
8
9
10
11
在shell中的示例:
fullfile=/mnt/cos2/venus_gram/ROM/leadcore_haige/leadcore_haige_AutoTag201608311742/cos-rom_1.2.-Leadcore_haige-201608311742.zip
filename=$(basename "$fullfile")
echo $filename # cos-rom_1.2.-Leadcore_haige-201608311742.zip
extension="${filename##*.}"
echo $extension # zip
filename="${filename%.*}"
echo $filename # cos-rom_1.2.-Leadcore_haige-2016083117422
3
4
5
6
7
8
9
10