diff --git a/.obsidian/bookmarks.json b/.obsidian/bookmarks.json index 2993304..902641a 100644 --- a/.obsidian/bookmarks.json +++ b/.obsidian/bookmarks.json @@ -4,6 +4,16 @@ "type": "file", "ctime": 1768298736833, "path": "docs/Obsidian/高频命令.md" + }, + { + "type": "file", + "ctime": 1768374029159, + "path": "docs/Obsidian笔记体系/Projects/saars开发/数据库配置.md" + }, + { + "type": "file", + "ctime": 1768374043546, + "path": "docs/Obsidian笔记体系/Projects/知你-调测/知你--调测.md" } ] } \ No newline at end of file diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 566d145..3f99c3b 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -13,12 +13,12 @@ "state": { "type": "markdown", "state": { - "file": "docs/Obsidian笔记体系/Daily/2026-01-13.md", + "file": "docs/adb调试命令/adb常用命令.md", "mode": "source", "source": false }, "icon": "lucide-file", - "title": "2026-01-13" + "title": "adb常用命令" } } ] @@ -53,7 +53,7 @@ "state": { "type": "search", "state": { - "query": "path:\"docs/\" ", + "query": "", "matchingCase": false, "explainSearch": false, "collapseAll": false, @@ -185,32 +185,33 @@ }, "active": "9a5781991bf94030", "lastOpenFiles": [ + "docs/cursor/cursor使用技巧.md", + "docs/adb调试命令/linux常用命令.md", + "docs/adb调试命令/常用linux命令.md", + "docs/adb调试命令/adb常用命令.md", + "docs/Obsidian笔记体系/Daily/2026-01-14.md", + "docs/Obsidian笔记体系/Daily/2026-01-13.md", + "docs/Obsidian笔记体系/Daily/2024-06-02.md", + "docs/cursor/cursor.md", "docs/Obsidian/高频命令.md", + "docs/Obsidian笔记体系/Projects/知你-调测/知你--调测.md", + "docs/Obsidian笔记体系/Projects/saars开发/数据库配置.md", + "docs/Obsidian笔记体系/Areas/03-Window系统/SurfaceFlinger交互流程.md", + "docs/Obsidian笔记体系/Areas/03-Window系统/窗口类型与层级.md", + "docs/Obsidian笔记体系/Areas/03-Window系统/触摸事件传递.md", + "docs/dify/密码输入错误次数超过限制时的机制.md", + "docs/dify/管理员账户.md", "docs/Obsidian/2026-01-05 个人文档管理.md", "未命名.base", - "docs/Obsidian笔记体系/Daily/2026-01-13.md", - "docs/Obsidian笔记体系/Projects/知你-调测/知你--调测.md", "个人笔记体系.md", "使用说明.md", "docs/Obsidian笔记体系/README.md", "docs/gerrit/gerrit每日工作流程.md", - "docs/cursor/cursor.md", "docs/Obsidian/资源网站.md", "docs/Obsidian/重要笔记.md", "docs/dify/作为安卓高级开发工程师,除了项目管理,你完全可以在技术专项、团队效能和个人成长三大领域构建更懂你的专属助手.md", "docs/dify/使用dify,可以生成一个专项事务助手吗,比如公司正规化事务助手.md", - "docs/Obsidian笔记体系/Projects/saars开发/数据库配置.md", "docs/git/git常用命令.md", - "docs/git/hello.md", - "docs/学习笔记/前端学习.md", - "docs/git/test.md", - "docs/学习笔记/效率提升.md", - "docs/gerrit/生成并配置SSH密钥、克隆仓库.md", - "docs/git/git设置用户名和邮箱.md", - "docs/学习笔记/个人全自动研发体系.md", - "docs/学习笔记/DevOps学习.md", - "docs/git/git同步远程分支总结.md", - "docs/学习笔记/honor工作资料.md", "docs/Obsidian笔记体系/Projects/知你-调测", "docs/gerrit", "gerrit", diff --git a/docs/Obsidian/高频命令.md b/docs/Obsidian/高频命令.md index b97c925..331fca2 100644 --- a/docs/Obsidian/高频命令.md +++ b/docs/Obsidian/高频命令.md @@ -4,6 +4,9 @@ git remote set-url origin http://101.43.95.130:3001/admin/push_server.git git remote set-url origin http://101.43.95.130:3001/admin/coupon.git +最常用:查看所有远程仓库的 URL(推荐) +git remote -v + git config --global user.name "renjianbo" git config --global user.email "18691577328@qq.com" diff --git a/docs/Obsidian笔记体系/Daily/2026-01-14.md b/docs/Obsidian笔记体系/Daily/2026-01-14.md new file mode 100644 index 0000000..ce3c758 --- /dev/null +++ b/docs/Obsidian笔记体系/Daily/2026-01-14.md @@ -0,0 +1,131 @@ +## 基本信息 +- **日期**: 2026-01-14 +- **星期**: 星期三 +- **天气**: 晴 +- **心情**: 良好 + +## 今日计划 + +### 工作安排 +- [ ] 知你--会员功能 +- [ ] 知你--聊天会话界面跑马灯温馨提示 + +### 学习计划 +- [ ] 学习内容1 +- [ ] 学习内容2 + +### 其他计划 +- [ ] 其他事项1 + +## 工作记录 + +### 已完成 +- ✅ 知你--会员功能开发 + - 时间: HH:MM - HH:MM + - 内容: http://101.43.95.130:8082/c/zhini_im/+/106 + - 收获: + +- ✅ 知你--聊天会话界面跑马灯温馨提示 + - 时间: HH:MM - HH:MM + - 内容: http://101.43.95.130:8082/c/zhini_im/+/107 + - 收获: +### 进行中 +- 🔄 进行中事项1 + - 开始时间: HH:MM + - 当前进度: + - 遇到的问题: + - 下一步计划: + - 继续知你--会员功能开发 + +### 待处理 +- ⏳ 待处理事项1 + - 计划时间: HH:MM + - 优先级: 高/中/低 + +## 学习记录 + +### 技术学习 +- **学习内容**: +- **学习时间**: HH:MM - HH:MM +- **学习方式**: 阅读/实践/视频 +- **关键收获**: +- **相关链接**: [[相关文档]] + +### 源码阅读 +- **阅读模块**: +- **阅读时间**: HH:MM - HH:MM +- **关键理解**: +- **疑问**: +- **相关链接**: [[相关源码]] + +### 问题解决 +- **问题描述**: +- **解决过程**: +- **解决方案**: +- **经验总结**: +- **相关链接**: [[相关文档]] + +## 会议记录 + +### 会议1 +- **时间**: HH:MM - HH:MM +- **主题**: +- **参与人**: +- **关键内容**: +- **行动项**: +- **相关链接**: [[会议记录]] + +## 思考与总结 + +### 今日收获 +1. 收获1 +2. 收获2 +3. 收获3 + +### 今日反思 +- 做得好的地方: +- 需要改进的地方: +- 改进计划: + +### 明日计划 +1. 计划1 +2. 计划2 +3. 计划3 + +## 技术笔记 + +### 技术点1 +- **内容**: +- **代码示例**: +```java +// 代码示例 +``` + +- **关键理解**: +- **相关链接**: [[相关文档]] + +### 技术点2 +- **内容**: +- **关键理解**: + +## 问题与疑问 + +### 问题1 +- **问题描述**: +- **思考**: +- **待解决**: + +### 问题2 +- **问题描述**: +- **思考**: + +## 相关链接 + +- [[相关项目]] +- [[相关文档]] +- [[相关笔记]] + +## 备注 + +- 备注1 +- 备注2 diff --git a/docs/adb调试命令/adb常用命令.md b/docs/adb调试命令/adb常用命令.md index e75f07a..1b663dd 100644 --- a/docs/adb调试命令/adb常用命令.md +++ b/docs/adb调试命令/adb常用命令.md @@ -1,189 +1,746 @@ -adb devices           获取链接的设备 - -adb get-state         获取设备状态 - -adb start-server     启动adb服务 - -adb kill-server       关闭adb服务 - -adb connect          连接设备 - -adb disconnect      断开设备 - -adb install 软件名称 apk 安装软件 - -adb install -r 软件名称 apk 重新安装软件 - -adb uninstall apk包名  卸载软件 - -adb uninstall -k  包名 保留数据卸载 - -adb logcat      查看手机上的运行日志,可以用此项来查错 - -adb push  本地路径  安卓路径   本地向安卓传输数据 - -adb pull  安卓路径  本地路径      从安卓端下载到本地 - -Adb remount         重新挂载系统文件 - -Adb get-serilno     获取系列号 - -Adb shell dmesg    打印内核的调试信息 - -Adb reboot            重启手机 - -Adb reboot recovery 重启手机到recovery界面 - -Adb reboot bootloader        重启手机到bootloader界面 - -Adb version   查看版本 - -adb shell        进入手机终端 - -adb shell screencap  /sdcard/sreen.png   截图 - -adb shell dumpsys battery 查看电量 - -adb shell dumpsys cpuinfo  获取cpu信息 - -adb shell svc wifi enable   打开wifi - -adb shell svc wifi disable  关闭wifi - -adb shell wm size   查看分辨率 - -adb shell momkey -p 包名 -v 100    单应用-100个随机事件压力测试 - -adb shell momkey -p 包名 -p 包名 -v -v 100   多应用-100个随机事件压力测试 - - am 命令(activity manager) - -adb shell am start -n packagename/activity    直接启动 - -adb shell am start -S packagename/activy       先停止在启动 - -adb shell am start -W packagename/activy     等待启动完成 - -action adb shell am start -a android.intent.action.CALL -d [tel:10086](tel:10086)   拨打电话 - -adb shell am start -a android.intent.action.VIEW -d 百度一下,你就知道      打开网页 - -adb shell am monitor          打开软件启动监控 - - adb shell am force-stop packagename          强制关闭app - -Pm 命令(package manager) - -Adb shell pm list package          列出安装包所有应用名 - -Adb shell pm list package -3      列出所有第三方包 - -Adb shell pm dump packagename           应用详细信息 - -Adb shell pm path       安装的应用包的apk 位置 - -Adb shell pm install     安装设备上的apk - -adb shell pm clear  包名   清理程序数据 - -Input 命令 - -Adb shell input text aimomo             键盘输入aimomo - -Adb shell input tap 300 700              模拟点击x=300,y=700 - -Adb shell input keyevent KEYCODE_HOME 模拟点击home键 - -Adb shell input swipe 300 500 300 900 模拟滑动 - -adb 常用命令使用指南,希望对你有帮助 - -1、 adb devices 查看设备列表 - -查看电脑已连接Android 设备列表,多行显示表示连接多个Android设备,每行前面的字符串表示Android设备的SN号 - -2、adb  get-state 获取连接状态 device offline unkown - -3、adb install -r  APK路径 安装应用 - -apk文件所在的文件路径,包括apk,如D:/hello.apk,注意需要打开的cmd路径不要带有中文,否则,部分电脑可能会提示安装失败 - -4、adb uninstall 应用包名,应用卸载   查看自己安装的包名,adb uninstall -k hello.apk 下载应用,但保留缓存数据 - -5、adb connect 设备ip地址,如果电脑与设备在同一局域网内,Android设备的连接ip 地址,可连接成功 - -6、adb push 电脑上的文件 路径 sdcard/  将电脑的文件输入到手机上 - -      如文件D:/hello.apk, adb push D:/hello.apk  /sdcard、hello.apk - -7、adb pull  /sdcard/文件路径 指定的pc目录,将文件拷贝到pc,文件保存的路径直接与cmd打开的路径相同 - -8、adb reboot 或加参数-p设备进行重启 - -9、 adb shell pm clear 包名 清除应用数据 - -10 、adb shell pm list packages -3 查看第三方安装的应用包名,卸载应用前,一般可通过该指令查看包名 - -11、adb shell am force-stop 包名 关闭应用 - -12、adb shell screencap /sdcard/screen.png  截屏幕 - -13、adb shell screenrecord /sdcard/hello.mp4 屏幕视频录制,测试时可使用 - -14、adb logcat 抓取日志 - -如果要过滤日志,可通过adb logcat | findstr "输入过滤的内容" - -15、adb shell wm size 查看屏幕大小 - -16、 adb shell getprop查看配置信息 - -如:adb shell getprop ro.build.version.sdk 查看api版本 - -17、adb shell input keyevent 4 相当于返回键,返回上一页 - -18、adb shell df 查看手机存储信息 - -19、adb shell  pm disable-user com.android.launcher3 禁用系统应用 - -20、 adb shell pm enable com.android.launcher3 启用系统 ,需要root权限 - -21、adb start-server | kill-server //启动或关闭adb服务进程 - -22、adb shell cat /sys/class/net/wlan0/address   //获取mac地址 - -23、adb shell monkey -p 包名 --throttle 100 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -v -v -v –s 1540475754297 100  monkey测试 - -24、adb shell ls /system/bin  查看当前设备可以使用的所有命令 - -25、adb shell input text "[www.baidu.com](http://www.baidu.com)",在编辑的文本框中输入编辑文字 - -26、adb shell svc wifi enable | disable   打开或关闭wifi - -27、adb shell svc data enable |disable 打开或关闭移动网络 - -28、adb shell input swipe 760 500 600 320 点击屏幕,根据实际坐标点击 - -29、adb shell mkdir   /sdcard/创建目录 - -30、cat /proc/cpuinfo // 查看CPU信息,如果为内存,则cat/proc/meminfo - -31、cat /data/misc/wifi/*.conf 查看wifi密码,需要root权限 - -32、 mount -o remount,rw / 当root权限之后,仍提示file system read only时,先执行adb root ,接着执行adb remount, mount -o remount,rw / 然后执行该指令 - -33、(1)setprop service.adb.tcp.port 5555 (2)stop adbd (3)start adbd 使用wifi连接失败时, - -34、adb shell dumpsys activity | findstr “mFocus” 获取当前的activity - -35、adb shell settings put global policy_control immersive.full=* - -36、仅隐藏状态栏:adb shell settings put global policy_control immersive.status=* - -37、仅隐藏虚拟键:adb shell settings put global policy_control immersive.navigation=* - -38、恢复:adb shell settings put global policy_control null - -39、完全隐藏  adb shell wm overscan 0,0,0,0 - -40、旋转屏幕 \ No newline at end of file +# ADB 常用命令指南 + +## 目录 +- [设备连接管理](#设备连接管理) +- [应用安装与卸载](#应用安装与卸载) +- [文件传输](#文件传输) +- [日志查看](#日志查看) +- [系统操作](#系统操作) +- [Activity Manager (am) 命令](#activity-manager-am-命令) +- [Package Manager (pm) 命令](#package-manager-pm-命令) +- [Input 输入命令](#input-输入命令) +- [屏幕操作](#屏幕操作) +- [系统信息查询](#系统信息查询) +- [网络操作](#网络操作) +- [Monkey 压力测试](#monkey-压力测试) +- [高级调试技巧](#高级调试技巧) + +--- + +## 设备连接管理 + +### 查看设备列表 +```bash +adb devices +``` +- 显示所有已连接的Android设备 +- 多行显示表示连接多个设备 +- 每行前面的字符串表示设备的SN号(序列号) + +### 获取设备状态 +```bash +adb get-state +``` +- 返回设备状态:`device`(已连接)、`offline`(离线)、`unknown`(未知) + +### 启动/关闭 ADB 服务 +```bash +adb start-server # 启动adb服务 +adb kill-server # 关闭adb服务 +``` + +### 连接/断开设备 +```bash +adb connect <设备IP地址> # 通过WiFi连接设备(需在同一局域网) +adb disconnect # 断开当前设备连接 +adb disconnect <设备IP地址> # 断开指定设备 +``` + +### WiFi 连接设置 +```bash +# 1. 使用USB连接设备 +adb tcpip 5555 + +# 2. 断开USB,使用WiFi连接 +adb connect <设备IP地址>:5555 + +# 如果WiFi连接失败,在设备上执行: +adb shell setprop service.adb.tcp.port 5555 +adb shell stop adbd +adb shell start adbd +``` + +--- + +## 应用安装与卸载 + +### 安装应用 +```bash +adb install # 安装APK +adb install -r # 重新安装(覆盖已安装版本) +adb install -s <设备SN> # 指定设备安装(多设备时) +adb install -d # 允许降级安装 +adb install -g # 授予所有运行时权限 +``` + +**示例:** +```bash +adb install D:/hello.apk +# 注意:cmd路径不要包含中文,否则可能安装失败 +``` + +### 卸载应用 +```bash +adb uninstall <包名> # 卸载应用 +adb uninstall -k <包名> # 卸载应用但保留数据和缓存 +``` + +**示例:** +```bash +adb uninstall com.example.app +adb uninstall -k com.example.app +``` + +--- + +## 文件传输 + +### 推送文件到设备 +```bash +adb push <本地文件路径> <设备路径> +``` + +**示例:** +```bash +adb push D:/hello.apk /sdcard/hello.apk +adb push D:/test.txt /sdcard/Download/test.txt +``` + +### 从设备拉取文件 +```bash +adb pull <设备路径> <本地保存路径> +``` + +**示例:** +```bash +adb pull /sdcard/screen.png D:/screenshots/ +adb pull /sdcard/Download/file.txt ./ +``` + +--- + +## 日志查看 + +### 基本日志查看 +```bash +adb logcat # 查看所有日志 +adb logcat -c # 清空日志缓冲区 +adb logcat -v time # 显示时间戳 +adb logcat -v threadtime # 显示线程和时间 +adb logcat -v long # 详细格式 +``` + +### 过滤日志 +```bash +# 按标签过滤 +adb logcat -s TAG1 TAG2 + +# 按优先级过滤(V/D/I/W/E/F/S) +adb logcat *:E # 只显示错误级别 +adb logcat *:W # 显示警告及以上 + +# 组合过滤 +adb logcat -s TAG:*:E # 特定标签的错误日志 + +# 使用管道过滤(Windows) +adb logcat | findstr "关键字" +adb logcat | findstr /i "error" + +# 使用管道过滤(Linux/Mac) +adb logcat | grep "关键字" +adb logcat | grep -i "error" +``` + +### 保存日志到文件 +```bash +adb logcat > log.txt # 保存所有日志 +adb logcat -v time > log.txt # 保存带时间戳的日志 +adb logcat -s TAG:*:E > error_log.txt # 保存过滤后的日志 +adb logcat -d > log.txt # 一次性获取当前日志并退出 +``` + +### 按时间过滤日志 +```bash +adb logcat -t 100 # 显示最后100行 +adb logcat -t '01-01 12:00:00.000' # 显示指定时间之后的日志 +``` + +--- + +## 系统操作 + +### 重启设备 +```bash +adb reboot # 普通重启 +adb reboot recovery # 重启到Recovery模式 +adb reboot bootloader # 重启到Bootloader模式 +adb reboot -p # 关机(部分设备支持) +``` + +### 重新挂载系统分区 +```bash +adb remount # 重新挂载系统分区为可写(需要root) +adb root # 以root权限重启adb +``` + +### 进入Shell +```bash +adb shell # 进入设备Shell +adb shell <命令> # 直接执行Shell命令 +``` + +**示例:** +```bash +adb shell ls /sdcard +adb shell cat /proc/cpuinfo +``` + +--- + +## Activity Manager (am) 命令 + +### 启动Activity +```bash +# 基本启动 +adb shell am start -n <包名>/ + +# 先停止再启动 +adb shell am start -S -n <包名>/ + +# 等待启动完成 +adb shell am start -W -n <包名>/ + +# 启动并传递数据 +adb shell am start -a -d -t +``` + +**示例:** +```bash +# 启动主Activity +adb shell am start -n com.example.app/.MainActivity + +# 拨打电话 +adb shell am start -a android.intent.action.CALL -d tel:10086 + +# 打开网页 +adb shell am start -a android.intent.action.VIEW -d "https://www.baidu.com" + +# 打开应用市场 +adb shell am start -a android.intent.action.VIEW -d "market://details?id=com.example.app" +``` + +### 启动Service +```bash +adb shell am startservice -n <包名>/ +``` + +### 发送广播 +```bash +adb shell am broadcast -a +``` + +**示例:** +```bash +# 发送开机广播 +adb shell am broadcast -a android.intent.action.BOOT_COMPLETED +``` + +### 监控Activity启动 +```bash +adb shell am monitor # 监控应用启动和崩溃 +``` + +### 强制停止应用 +```bash +adb shell am force-stop <包名> +``` + +### 获取当前Activity +```bash +# Windows +adb shell dumpsys activity | findstr "mFocus" + +# Linux/Mac +adb shell dumpsys activity | grep "mFocus" + +# 更精确的方式 +adb shell dumpsys window windows | findstr "mCurrentFocus" +``` + +### 获取Activity栈信息 +```bash +adb shell dumpsys activity activities +``` + +--- + +## Package Manager (pm) 命令 + +### 列出应用 +```bash +adb shell pm list packages # 列出所有应用包名 +adb shell pm list packages -3 # 只列出第三方应用 +adb shell pm list packages -s # 只列出系统应用 +adb shell pm list packages -u # 列出已卸载的应用 +adb shell pm list packages -f # 显示应用关联的apk文件 +adb shell pm list packages -i # 显示应用的安装器 +``` + +### 应用信息查询 +```bash +adb shell pm dump <包名> # 显示应用详细信息 +adb shell pm path <包名> # 显示应用APK路径 +adb shell pm list packages -f <包名> # 显示应用APK路径(另一种方式) +``` + +**示例:** +```bash +adb shell pm dump com.example.app +adb shell pm path com.example.app +# 输出:package:/data/app/com.example.app-xxx/base.apk +``` + +### 安装/卸载(设备端) +```bash +adb shell pm install # 在设备上安装APK +adb shell pm uninstall <包名> # 在设备上卸载应用 +``` + +### 清除应用数据 +```bash +adb shell pm clear <包名> # 清除应用数据和缓存 +``` + +### 启用/禁用应用 +```bash +adb shell pm disable-user <包名> # 禁用应用(需要root) +adb shell pm enable <包名> # 启用应用(需要root) +``` + +**示例:** +```bash +adb shell pm disable-user com.android.launcher3 +adb shell pm enable com.android.launcher3 +``` + +--- + +## Input 输入命令 + +### 文本输入 +```bash +adb shell input text "文本内容" +``` + +**示例:** +```bash +adb shell input text "aimomo" +adb shell input text "www.baidu.com" +``` + +**注意:** 不支持中文输入,空格需要用 `%s` 表示 + +### 点击操作 +```bash +adb shell input tap +``` + +**示例:** +```bash +adb shell input tap 300 700 +``` + +### 按键事件 +```bash +adb shell input keyevent <键码> +``` + +**常用键码:** +```bash +adb shell input keyevent KEYCODE_HOME # Home键 +adb shell input keyevent KEYCODE_BACK # 返回键 +adb shell input keyevent KEYCODE_MENU # 菜单键 +adb shell input keyevent KEYCODE_VOLUME_UP # 音量+ +adb shell input keyevent KEYCODE_VOLUME_DOWN # 音量- +adb shell input keyevent KEYCODE_POWER # 电源键 +adb shell input keyevent KEYCODE_ENTER # 回车键 +adb shell input keyevent KEYCODE_DEL # 删除键 + +# 使用数字键码 +adb shell input keyevent 3 # Home键 +adb shell input keyevent 4 # 返回键 +adb shell input keyevent 24 # 音量+ +adb shell input keyevent 25 # 音量- +adb shell input keyevent 26 # 电源键 +``` + +### 滑动操作 +```bash +adb shell input swipe [持续时间(ms)] +``` + +**示例:** +```bash +# 从(300, 500)滑动到(300, 900) +adb shell input swipe 300 500 300 900 + +# 快速滑动(100ms) +adb shell input swipe 300 500 300 900 100 + +# 模拟长按(500ms) +adb shell input swipe 300 500 300 500 500 +``` + +### 长按操作 +```bash +adb shell input swipe 500 +``` + +--- + +## 屏幕操作 + +### 截图 +```bash +adb shell screencap <保存路径> +``` + +**示例:** +```bash +adb shell screencap /sdcard/screen.png +adb pull /sdcard/screen.png ./ +``` + +### 录屏 +```bash +adb shell screenrecord <保存路径> [选项] +``` + +**选项:** +- `--time-limit <秒>`: 限制录制时间(默认180秒) +- `--size <宽x高>`: 设置分辨率 +- `--bit-rate <比特率>`: 设置比特率(默认4Mbps) + +**示例:** +```bash +# 录制10秒视频 +adb shell screenrecord --time-limit 10 /sdcard/video.mp4 + +# 设置分辨率 +adb shell screenrecord --size 1280x720 /sdcard/video.mp4 + +# 停止录制:Ctrl+C 或执行时间限制 +``` + +### 查看屏幕分辨率 +```bash +adb shell wm size +adb shell wm size <宽x高> # 设置分辨率(需要root) +``` + +### 隐藏状态栏和导航栏 +```bash +# 完全沉浸式(隐藏状态栏和导航栏) +adb shell settings put global policy_control immersive.full=* + +# 仅隐藏状态栏 +adb shell settings put global policy_control immersive.status=* + +# 仅隐藏导航栏 +adb shell settings put global policy_control immersive.navigation=* + +# 恢复显示 +adb shell settings put global policy_control null + +# 完全隐藏(另一种方式) +adb shell wm overscan 0,0,0,0 +``` + +--- + +## 系统信息查询 + +### 查看系统属性 +```bash +adb shell getprop # 查看所有系统属性 +adb shell getprop <属性名> # 查看特定属性 +``` + +**常用属性:** +```bash +adb shell getprop ro.build.version.sdk # API版本 +adb shell getprop ro.build.version.release # Android版本 +adb shell getprop ro.product.model # 设备型号 +adb shell getprop ro.product.manufacturer # 制造商 +adb shell getprop ro.serialno # 序列号 +``` + +### 查看CPU信息 +```bash +adb shell cat /proc/cpuinfo +adb shell dumpsys cpuinfo +``` + +### 查看内存信息 +```bash +adb shell cat /proc/meminfo +adb shell dumpsys meminfo +adb shell dumpsys meminfo <包名> # 查看特定应用内存 +``` + +### 查看存储信息 +```bash +adb shell df # 查看存储空间 +adb shell df -h # 人类可读格式 +``` + +### 查看电量信息 +```bash +adb shell dumpsys battery +``` + +### 查看网络信息 +```bash +# 查看MAC地址 +adb shell cat /sys/class/net/wlan0/address + +# 查看IP地址 +adb shell ip addr show wlan0 +adb shell ifconfig wlan0 +``` + +### 查看设备信息 +```bash +adb shell getprop ro.build.version.sdk # SDK版本 +adb shell getprop ro.build.version.release # Android版本 +adb shell getprop ro.product.model # 设备型号 +adb shell getprop ro.product.brand # 品牌 +adb shell getprop ro.product.manufacturer # 制造商 +``` + +### 查看可用命令 +```bash +adb shell ls /system/bin # 查看系统命令 +adb shell which <命令名> # 查找命令路径 +``` + +--- + +## 网络操作 + +### WiFi控制 +```bash +adb shell svc wifi enable # 打开WiFi +adb shell svc wifi disable # 关闭WiFi +``` + +### 移动网络控制 +```bash +adb shell svc data enable # 打开移动数据 +adb shell svc data disable # 关闭移动数据 +``` + +### 查看WiFi密码(需要root) +```bash +adb shell cat /data/misc/wifi/*.conf +``` + +--- + +## Monkey 压力测试 + +### 基本Monkey测试 +```bash +adb shell monkey -p <包名> -v <事件数> +``` + +**示例:** +```bash +# 单应用100个随机事件 +adb shell monkey -p com.example.app -v 100 + +# 多应用测试 +adb shell monkey -p com.app1 -p com.app2 -v -v 100 +``` + +### 完整Monkey测试命令 +```bash +adb shell monkey -p <包名> \ + --throttle 100 \ # 事件间隔100ms + --ignore-crashes \ # 忽略崩溃 + --ignore-timeouts \ # 忽略超时 + --ignore-security-exceptions \ # 忽略安全异常 + --ignore-native-crashes \ # 忽略Native崩溃 + --monitor-native-crashes \ # 监控Native崩溃 + -v -v -v \ # 详细日志(3级) + -s <种子值> \ # 设置随机种子 + <事件数> +``` + +**示例:** +```bash +adb shell monkey -p com.example.app \ + --throttle 100 \ + --ignore-crashes \ + --ignore-timeouts \ + --ignore-security-exceptions \ + --ignore-native-crashes \ + --monitor-native-crashes \ + -v -v -v \ + -s 1540475754297 \ + 1000 +``` + +### Monkey测试选项说明 +- `-p <包名>`: 指定测试的应用包名 +- `-v`: 日志详细程度(可叠加,最多3个) +- `--throttle <毫秒>`: 事件之间的延迟 +- `--ignore-crashes`: 忽略应用崩溃,继续测试 +- `--ignore-timeouts`: 忽略ANR,继续测试 +- `--ignore-security-exceptions`: 忽略权限异常 +- `-s <种子值>`: 设置随机种子,可重现测试序列 +- `--pct-touch <百分比>`: 触摸事件百分比 +- `--pct-motion <百分比>`: 滑动事件百分比 +- `--pct-trackball <百分比>`: 轨迹球事件百分比 +- `--pct-nav <百分比>`: 导航事件百分比 +- `--pct-syskeys <百分比>`: 系统按键事件百分比 + +--- + +## 高级调试技巧 + +### 查看内核日志 +```bash +adb shell dmesg # 查看内核调试信息 +adb shell dmesg | tail -100 # 查看最后100行 +``` + +### 文件系统操作 +```bash +# 创建目录 +adb shell mkdir /sdcard/test + +# 查看文件 +adb shell cat <文件路径> +adb shell ls -l <目录路径> + +# 删除文件 +adb shell rm <文件路径> + +# 复制文件 +adb shell cp <源路径> <目标路径> + +# 移动文件 +adb shell mv <源路径> <目标路径> +``` + +### 权限管理 +```bash +# 当root权限后仍提示只读时 +adb root +adb remount +adb shell mount -o remount,rw / +``` + +### 查看系统服务 +```bash +adb shell service list # 列出所有服务 +adb shell dumpsys <服务名> # 查看服务信息 +``` + +**常用服务:** +```bash +adb shell dumpsys activity # Activity信息 +adb shell dumpsys window # 窗口信息 +adb shell dumpsys meminfo # 内存信息 +adb shell dumpsys battery # 电池信息 +adb shell dumpsys cpuinfo # CPU信息 +adb shell dumpsys package # 包信息 +adb shell dumpsys connectivity # 网络连接信息 +``` + +### 性能监控 +```bash +# 查看CPU使用率 +adb shell top +adb shell top -n 1 # 只显示一次 + +# 查看特定进程 +adb shell top | grep <进程名> + +# 查看网络统计 +adb shell cat /proc/net/dev +``` + +### 应用调试 +```bash +# 查看应用进程 +adb shell ps | grep <包名> + +# 查看应用UID +adb shell dumpsys package <包名> | grep userId + +# 查看应用权限 +adb shell dumpsys package <包名> | grep permission +``` + +### 快速操作组合 +```bash +# 一键截图并拉取 +adb shell screencap /sdcard/screen.png && adb pull /sdcard/screen.png ./ + +# 一键清理日志并开始记录 +adb logcat -c && adb logcat > log.txt + +# 一键安装并启动 +adb install app.apk && adb shell am start -n com.example.app/.MainActivity +``` + +--- + +## 常用命令速查表 + +| 功能 | 命令 | +|------|------| +| 查看设备 | `adb devices` | +| 安装应用 | `adb install -r app.apk` | +| 卸载应用 | `adb uninstall <包名>` | +| 查看日志 | `adb logcat` | +| 过滤日志 | `adb logcat \| grep "关键字"` | +| 截图 | `adb shell screencap /sdcard/screen.png` | +| 录屏 | `adb shell screenrecord /sdcard/video.mp4` | +| 启动应用 | `adb shell am start -n <包名>/` | +| 停止应用 | `adb shell am force-stop <包名>` | +| 查看当前Activity | `adb shell dumpsys activity \| grep mFocus` | +| 查看包列表 | `adb shell pm list packages -3` | +| 清除数据 | `adb shell pm clear <包名>` | +| 点击屏幕 | `adb shell input tap x y` | +| 输入文本 | `adb shell input text "内容"` | +| 滑动 | `adb shell input swipe x1 y1 x2 y2` | +| 按键 | `adb shell input keyevent KEYCODE_HOME` | +| 重启 | `adb reboot` | +| 查看系统版本 | `adb shell getprop ro.build.version.release` | +| 查看SDK版本 | `adb shell getprop ro.build.version.sdk` | + +--- + +## 注意事项 + +1. **路径问题**:Windows下路径不要包含中文,否则可能失败 +2. **权限问题**:部分命令需要root权限(如`adb remount`、`pm disable`) +3. **多设备连接**:使用`-s <设备SN>`指定设备 +4. **WiFi连接**:需要设备与电脑在同一局域网 +5. **日志过滤**:Windows使用`findstr`,Linux/Mac使用`grep` +6. **Monkey测试**:建议在测试设备上运行,避免影响正常使用 + +--- + +## 参考资源 + +- [Android官方ADB文档](https://developer.android.com/studio/command-line/adb) +- [ADB命令完整参考](https://developer.android.com/studio/command-line/adb#direct) +- [Monkey测试文档](https://developer.android.com/studio/test/monkey) + +--- + +*最后更新:2024年* diff --git a/docs/adb调试命令/linux常用命令.md b/docs/adb调试命令/linux常用命令.md new file mode 100644 index 0000000..95b4db0 --- /dev/null +++ b/docs/adb调试命令/linux常用命令.md @@ -0,0 +1,780 @@ +# Linux 常用命令指南 + +## 目录 +- [文件与目录操作](#文件与目录操作) +- [文件查看与编辑](#文件查看与编辑) +- [文件搜索](#文件搜索) +- [权限管理](#权限管理) +- [进程管理](#进程管理) +- [系统信息](#系统信息) +- [网络操作](#网络操作) +- [压缩与解压](#压缩与解压) +- [文本处理](#文本处理) +- [磁盘管理](#磁盘管理) +- [用户管理](#用户管理) +- [服务管理](#服务管理) +- [常用快捷键](#常用快捷键) +- [组合命令](#组合命令) + +--- + +## 文件与目录操作 + +### 目录操作 +```bash +# 查看当前目录 +pwd + +# 切换目录 +cd <目录路径> +cd ~ # 切换到用户主目录 +cd - # 切换到上一个目录 +cd .. # 切换到上级目录 +cd / # 切换到根目录 + +# 列出目录内容 +ls # 列出当前目录文件 +ls -l # 详细列表(长格式) +ls -a # 显示隐藏文件 +ls -la # 详细列表包含隐藏文件 +ls -lh # 人类可读的文件大小 +ls -lt # 按时间排序 +ls -ltr # 按时间倒序 +ls -R # 递归列出子目录 + +# 创建目录 +mkdir <目录名> # 创建单个目录 +mkdir -p dir1/dir2/dir3 # 递归创建多级目录 +mkdir dir1 dir2 dir3 # 创建多个目录 + +# 删除目录 +rmdir <目录名> # 删除空目录 +rm -r <目录名> # 递归删除目录 +rm -rf <目录名> # 强制递归删除(危险!) +``` + +### 文件操作 +```bash +# 创建文件 +touch <文件名> # 创建空文件或更新文件时间戳 +touch file1 file2 file3 # 创建多个文件 + +# 复制文件 +cp <源文件> <目标文件> # 复制文件 +cp -r <源目录> <目标目录> # 递归复制目录 +cp -p <源文件> <目标文件> # 保留文件属性 +cp -a <源目录> <目标目录> # 归档复制(保留所有属性) + +# 移动/重命名文件 +mv <源文件> <目标文件> # 移动或重命名文件 +mv <源目录> <目标目录> # 移动目录 + +# 删除文件 +rm <文件名> # 删除文件 +rm -f <文件名> # 强制删除(不提示) +rm -i <文件名> # 交互式删除(提示确认) +rm -rf <目录> # 递归强制删除目录(危险!) +``` + +### 文件链接 +```bash +# 创建硬链接 +ln <源文件> <链接名> + +# 创建软链接(符号链接) +ln -s <源文件> <链接名> +ln -s <源目录> <链接目录> +``` + +--- + +## 文件查看与编辑 + +### 查看文件内容 +```bash +# 查看整个文件 +cat <文件名> # 显示文件全部内容 +cat -n <文件名> # 显示行号 +cat file1 file2 # 连接多个文件显示 + +# 分页查看 +less <文件名> # 分页查看(可上下滚动) +more <文件名> # 分页查看(只能向下) + +# 查看文件头部 +head <文件名> # 显示前10行 +head -n 20 <文件名> # 显示前20行 +head -c 100 <文件名> # 显示前100字节 + +# 查看文件尾部 +tail <文件名> # 显示后10行 +tail -n 20 <文件名> # 显示后20行 +tail -f <文件名> # 实时跟踪文件变化(常用于日志) +tail -F <文件名> # 跟踪文件(文件被删除重建后继续跟踪) + +# 查看文件类型 +file <文件名> # 显示文件类型信息 + +# 统计文件信息 +wc <文件名> # 统计行数、单词数、字节数 +wc -l <文件名> # 只统计行数 +wc -w <文件名> # 只统计单词数 +wc -c <文件名> # 只统计字节数 +``` + +### 文件编辑 +```bash +# vi/vim 编辑器 +vi <文件名> # 打开文件编辑 +vim <文件名> # 打开文件编辑(增强版vi) + +# nano 编辑器(简单易用) +nano <文件名> # 打开文件编辑 + +# 基本vim操作 +# 进入编辑模式:按 i(插入)或 a(追加) +# 退出编辑模式:按 Esc +# 保存并退出::wq 或 :x +# 不保存退出::q! +# 保存不退出::w +``` + +--- + +## 文件搜索 + +### find 命令 +```bash +# 按名称搜索 +find <目录> -name "<文件名>" # 精确匹配 +find <目录> -name "*.txt" # 通配符匹配 +find <目录> -iname "*.txt" # 忽略大小写 + +# 按类型搜索 +find <目录> -type f # 只查找文件 +find <目录> -type d # 只查找目录 +find <目录> -type l # 只查找链接 + +# 按大小搜索 +find <目录> -size +100M # 大于100MB的文件 +find <目录> -size -10k # 小于10KB的文件 +find <目录> -size 50M # 等于50MB的文件 + +# 按时间搜索 +find <目录> -mtime -7 # 7天内修改的文件 +find <目录> -mtime +30 # 30天前修改的文件 +find <目录> -mmin -60 # 60分钟内修改的文件 + +# 按权限搜索 +find <目录> -perm 644 # 权限为644的文件 +find <目录> -perm -u+x # 用户有执行权限的文件 + +# 执行操作 +find <目录> -name "*.log" -delete # 删除找到的文件 +find <目录> -name "*.txt" -exec rm {} \; # 对找到的文件执行命令 +find <目录> -name "*.txt" -ok rm {} \; # 交互式执行 +``` + +### locate 命令(需要先建立索引) +```bash +locate <文件名> # 快速搜索文件(基于数据库) +updatedb # 更新locate数据库(需要root) +``` + +### grep 命令(文本搜索) +```bash +# 基本搜索 +grep "关键字" <文件名> # 在文件中搜索 +grep -i "关键字" <文件名> # 忽略大小写 +grep -v "关键字" <文件名> # 反向搜索(不匹配的行) +grep -n "关键字" <文件名> # 显示行号 +grep -c "关键字" <文件名> # 统计匹配行数 + +# 递归搜索 +grep -r "关键字" <目录> # 递归搜索目录 +grep -r -n "关键字" <目录> # 递归搜索并显示行号 + +# 正则表达式 +grep "^关键字" <文件名> # 以关键字开头 +grep "关键字$" <文件名> # 以关键字结尾 +grep -E "正则表达式" <文件名> # 扩展正则表达式 + +# 上下文显示 +grep -A 3 "关键字" <文件名> # 显示匹配行及后3行 +grep -B 3 "关键字" <文件名> # 显示匹配行及前3行 +grep -C 3 "关键字" <文件名> # 显示匹配行及前后3行 +``` + +### which/whereis 命令 +```bash +which <命令> # 查找命令的完整路径 +whereis <命令> # 查找命令、源码和手册页位置 +``` + +--- + +## 权限管理 + +### 查看权限 +```bash +ls -l <文件名> # 查看文件权限 +stat <文件名> # 查看详细文件信息 +``` + +### 修改权限(chmod) +```bash +# 数字方式 +chmod 755 <文件名> # rwxr-xr-x +chmod 644 <文件名> # rw-r--r-- +chmod 777 <文件名> # rwxrwxrwx(所有权限) + +# 符号方式 +chmod u+x <文件名> # 用户添加执行权限 +chmod g-w <文件名> # 组移除写权限 +chmod o+r <文件名> # 其他用户添加读权限 +chmod a+x <文件名> # 所有人添加执行权限 +chmod u=rwx,g=rx,o=r <文件名> # 分别设置权限 + +# 递归修改 +chmod -R 755 <目录> # 递归修改目录及子目录权限 +``` + +### 修改所有者(chown) +```bash +chown <用户> <文件名> # 修改文件所有者 +chown <用户>:<组> <文件名> # 修改所有者和组 +chown -R <用户> <目录> # 递归修改目录所有者 +``` + +### 修改组(chgrp) +```bash +chgrp <组名> <文件名> # 修改文件组 +chgrp -R <组名> <目录> # 递归修改目录组 +``` + +### 特殊权限 +```bash +# SUID(Set User ID) +chmod u+s <文件名> # 执行时以文件所有者身份运行 + +# SGID(Set Group ID) +chmod g+s <文件名> # 执行时以文件组身份运行 + +# Sticky Bit +chmod +t <目录> # 目录中只有所有者可以删除文件 +``` + +--- + +## 进程管理 + +### 查看进程 +```bash +# 基本查看 +ps # 显示当前终端进程 +ps aux # 显示所有进程详细信息 +ps -ef # 显示所有进程(另一种格式) +ps aux | grep <进程名> # 搜索特定进程 + +# 实时查看 +top # 实时显示进程(类似任务管理器) +htop # 增强版top(需要安装) +top -p # 只显示指定进程 + +# 按资源排序 +top -o %CPU # 按CPU使用率排序 +top -o %MEM # 按内存使用率排序 +``` + +### 进程控制 +```bash +# 启动进程 +<命令> & # 后台运行命令 +nohup <命令> & # 后台运行,终端关闭后继续 + +# 终止进程 +kill # 终止进程(发送SIGTERM信号) +kill -9 # 强制终止(发送SIGKILL信号) +killall <进程名> # 终止所有同名进程 +pkill <进程名> # 按名称终止进程 + +# 暂停/恢复进程 +kill -STOP # 暂停进程 +kill -CONT # 恢复进程 + +# 查看进程树 +pstree # 显示进程树 +pstree -p # 显示进程树和PID +``` + +### 作业控制 +```bash +jobs # 查看后台作业 +fg <作业号> # 将后台作业调到前台 +bg <作业号> # 将暂停的作业放到后台运行 +``` + +--- + +## 系统信息 + +### 系统版本 +```bash +uname -a # 显示所有系统信息 +uname -r # 显示内核版本 +uname -m # 显示机器架构 +cat /etc/os-release # 显示发行版信息 +lsb_release -a # 显示LSB信息(需要安装) +``` + +### CPU信息 +```bash +cat /proc/cpuinfo # 显示CPU详细信息 +lscpu # 显示CPU架构信息 +nproc # 显示CPU核心数 +``` + +### 内存信息 +```bash +free # 显示内存使用情况 +free -h # 人类可读格式 +free -m # 以MB为单位 +cat /proc/meminfo # 详细内存信息 +``` + +### 磁盘信息 +```bash +df # 显示磁盘使用情况 +df -h # 人类可读格式 +df -i # 显示inode使用情况 +du <目录> # 显示目录占用空间 +du -h <目录> # 人类可读格式 +du -sh <目录> # 只显示总计 +du -h --max-depth=1 <目录> # 只显示一级子目录 +``` + +### 系统负载 +```bash +uptime # 显示系统运行时间和负载 +w # 显示登录用户和负载 +``` + +### 硬件信息 +```bash +lspci # 显示PCI设备 +lsusb # 显示USB设备 +dmidecode # 显示硬件信息(需要root) +``` + +--- + +## 网络操作 + +### 网络配置 +```bash +# 查看IP地址 +ifconfig # 显示网络接口信息 +ip addr # 显示IP地址(新命令) +ip addr show # 显示所有接口 +hostname -I # 显示本机IP地址 + +# 配置网络 +ifconfig <接口> # 设置IP地址 +ip addr add /<掩码> dev <接口> # 添加IP地址 + +# 查看路由 +route -n # 显示路由表 +ip route # 显示路由表(新命令) +``` + +### 网络连接测试 +```bash +ping <主机> # 测试网络连通性 +ping -c 4 <主机> # 发送4个包后停止 +ping -i 2 <主机> # 每2秒发送一次 + +# 端口测试 +telnet <主机> <端口> # 测试端口连通性 +nc -zv <主机> <端口> # 测试端口(netcat) +``` + +### 网络下载 +```bash +wget # 下载文件 +wget -c # 断点续传 +wget -r # 递归下载 +curl # 下载文件(支持更多协议) +curl -O # 保存文件 +curl -L # 跟随重定向 +``` + +### 网络统计 +```bash +netstat -an # 显示所有网络连接 +netstat -tuln # 显示监听端口 +netstat -rn # 显示路由表 +ss -an # 显示网络连接(新命令,更快) +ss -tuln # 显示监听端口 +``` + +### 防火墙 +```bash +# iptables(需要root) +iptables -L # 列出规则 +iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 添加规则 + +# ufw(Ubuntu防火墙) +ufw status # 查看状态 +ufw enable # 启用防火墙 +ufw allow 80/tcp # 允许端口 +ufw deny 22/tcp # 拒绝端口 +``` + +--- + +## 压缩与解压 + +### tar 命令 +```bash +# 压缩 +tar -czf <压缩包名>.tar.gz <目录> # 创建gzip压缩包 +tar -cjf <压缩包名>.tar.bz2 <目录> # 创建bzip2压缩包 +tar -cJf <压缩包名>.tar.xz <目录> # 创建xz压缩包 + +# 解压 +tar -xzf <压缩包名>.tar.gz # 解压gzip压缩包 +tar -xjf <压缩包名>.tar.bz2 # 解压bzip2压缩包 +tar -xJf <压缩包名>.tar.xz # 解压xz压缩包 + +# 查看压缩包内容 +tar -tzf <压缩包名>.tar.gz # 列出gzip压缩包内容 +tar -tjf <压缩包名>.tar.bz2 # 列出bzip2压缩包内容 + +# 常用选项说明 +# -c: 创建压缩包 +# -x: 解压 +# -z: gzip压缩 +# -j: bzip2压缩 +# -J: xz压缩 +# -f: 指定文件名 +# -v: 显示过程 +# -C: 指定解压目录 +``` + +### zip/unzip 命令 +```bash +zip -r <压缩包名>.zip <目录> # 压缩目录 +zip <压缩包名>.zip <文件1> <文件2> # 压缩文件 +unzip <压缩包名>.zip # 解压 +unzip -l <压缩包名>.zip # 查看压缩包内容 +unzip -d <目录> <压缩包名>.zip # 解压到指定目录 +``` + +### gzip/gunzip 命令 +```bash +gzip <文件名> # 压缩文件(生成.gz文件) +gunzip <文件名>.gz # 解压.gz文件 +gzip -d <文件名>.gz # 解压(另一种方式) +``` + +--- + +## 文本处理 + +### 文本过滤 +```bash +# cut 命令(按列提取) +cut -d: -f1 /etc/passwd # 以:为分隔符,提取第1列 +cut -c1-10 <文件名> # 提取第1-10个字符 + +# sort 命令(排序) +sort <文件名> # 排序文件 +sort -r <文件名> # 倒序排序 +sort -n <文件名> # 按数字排序 +sort -u <文件名> # 去重排序 + +# uniq 命令(去重) +uniq <文件名> # 去除相邻重复行 +uniq -c <文件名> # 统计重复次数 +uniq -d <文件名> # 只显示重复行 +uniq -u <文件名> # 只显示不重复行 + +# 组合使用 +sort <文件名> | uniq # 排序后去重 +``` + +### 文本替换 +```bash +# sed 命令(流编辑器) +sed 's/旧文本/新文本/g' <文件名> # 替换文本 +sed -i 's/旧文本/新文本/g' <文件名> # 直接修改文件 +sed 's/旧文本/新文本/g' <文件名> > 新文件 # 保存到新文件 +sed -n '10,20p' <文件名> # 显示第10-20行 +sed '10,20d' <文件名> # 删除第10-20行 + +# tr 命令(字符转换) +tr 'a-z' 'A-Z' < <文件名> # 小写转大写 +tr -d '\n' < <文件名> # 删除换行符 +``` + +### awk 命令(文本处理工具) +```bash +awk '{print $1}' <文件名> # 打印第1列 +awk -F: '{print $1}' <文件名> # 以:为分隔符,打印第1列 +awk '/关键字/ {print}' <文件名> # 打印包含关键字的行 +awk '{sum+=$1} END {print sum}' <文件名> # 计算第1列总和 +``` + +--- + +## 磁盘管理 + +### 磁盘分区 +```bash +fdisk -l # 列出所有分区(需要root) +lsblk # 以树形显示块设备 +parted -l # 显示分区信息 +``` + +### 挂载/卸载 +```bash +mount # 显示已挂载的文件系统 +mount <设备> <挂载点> # 挂载设备 +umount <挂载点> # 卸载设备 +umount -l <挂载点> # 强制卸载(lazy unmount) +``` + +### 文件系统检查 +```bash +fsck <设备> # 检查文件系统(需要root) +fsck -y <设备> # 自动修复错误 +``` + +--- + +## 用户管理 + +### 用户操作 +```bash +whoami # 显示当前用户名 +id # 显示用户ID和组ID +who # 显示登录用户 +w # 显示登录用户和活动 + +# 添加/删除用户(需要root) +useradd <用户名> # 添加用户 +userdel <用户名> # 删除用户 +passwd <用户名> # 修改用户密码 +``` + +### 切换用户 +```bash +su <用户名> # 切换用户 +su - <用户名> # 切换用户并加载环境变量 +sudo <命令> # 以root权限执行命令 +sudo -u <用户> <命令> # 以指定用户执行命令 +``` + +### 组操作 +```bash +groups # 显示当前用户所属组 +groupadd <组名> # 添加组(需要root) +groupdel <组名> # 删除组(需要root) +usermod -aG <组名> <用户名> # 将用户添加到组(需要root) +``` + +--- + +## 服务管理 + +### systemd 服务(现代Linux发行版) +```bash +systemctl status <服务名> # 查看服务状态 +systemctl start <服务名> # 启动服务 +systemctl stop <服务名> # 停止服务 +systemctl restart <服务名> # 重启服务 +systemctl reload <服务名> # 重新加载配置 +systemctl enable <服务名> # 设置开机自启 +systemctl disable <服务名> # 取消开机自启 +systemctl list-units # 列出所有服务 +systemctl list-unit-files # 列出所有服务文件 +``` + +### service 命令(传统方式) +```bash +service <服务名> status # 查看服务状态 +service <服务名> start # 启动服务 +service <服务名> stop # 停止服务 +service <服务名> restart # 重启服务 +``` + +--- + +## 常用快捷键 + +### 终端快捷键 +```bash +Ctrl + C # 中断当前命令 +Ctrl + D # 退出终端/结束输入 +Ctrl + Z # 暂停进程(放入后台) +Ctrl + L # 清屏(等同于clear) +Ctrl + A # 移动到行首 +Ctrl + E # 移动到行尾 +Ctrl + U # 删除光标前所有内容 +Ctrl + K # 删除光标后所有内容 +Ctrl + W # 删除光标前一个单词 +Ctrl + R # 搜索历史命令 +Tab # 自动补全 +``` + +### 历史命令 +```bash +history # 显示命令历史 +history | grep <关键字> # 搜索历史命令 +!! # 执行上一条命令 +!<编号> # 执行历史中指定编号的命令 +!<字符串> # 执行最近以字符串开头的命令 +``` + +--- + +## 组合命令 + +### 管道操作 +```bash +# 基本管道 +命令1 | 命令2 # 将命令1的输出作为命令2的输入 + +# 示例 +ps aux | grep python # 查找python进程 +cat file.txt | grep "关键字" # 在文件中搜索 +ls -l | wc -l # 统计文件数量 +``` + +### 重定向 +```bash +命令 > 文件 # 输出重定向到文件(覆盖) +命令 >> 文件 # 输出追加到文件 +命令 < 文件 # 从文件读取输入 +命令 2> 文件 # 错误输出重定向 +命令 > 文件 2>&1 # 标准输出和错误都重定向 +命令 > /dev/null 2>&1 # 丢弃所有输出 +``` + +### 逻辑操作 +```bash +命令1 && 命令2 # 命令1成功才执行命令2 +命令1 || 命令2 # 命令1失败才执行命令2 +命令1 ; 命令2 # 顺序执行命令(无论成功失败) +``` + +### 常用组合示例 +```bash +# 查找并删除 +find . -name "*.log" -delete + +# 统计文件行数 +find . -name "*.txt" -exec wc -l {} \; | awk '{sum+=$1} END {print sum}' + +# 查找大文件 +find . -type f -size +100M -exec ls -lh {} \; + +# 批量重命名 +for file in *.txt; do mv "$file" "${file%.txt}.bak"; done + +# 监控日志 +tail -f /var/log/syslog | grep "ERROR" + +# 压缩并删除原文件 +tar -czf backup.tar.gz dir/ && rm -rf dir/ + +# 查找并替换 +find . -name "*.txt" -exec sed -i 's/旧文本/新文本/g' {} \; +``` + +--- + +## 实用技巧 + +### 别名设置 +```bash +# 临时设置 +alias ll='ls -alF' +alias la='ls -A' +alias l='ls -CF' + +# 永久设置(添加到 ~/.bashrc 或 ~/.bash_profile) +echo "alias ll='ls -alF'" >> ~/.bashrc +source ~/.bashrc # 重新加载配置 +``` + +### 环境变量 +```bash +echo $PATH # 显示PATH变量 +export PATH=$PATH:/新路径 # 添加PATH +export VAR=value # 设置环境变量 +env # 显示所有环境变量 +``` + +### 后台运行 +```bash +nohup <命令> & # 后台运行,忽略挂起信号 +screen -S <会话名> # 创建screen会话 +screen -r <会话名> # 恢复screen会话 +tmux new -s <会话名> # 创建tmux会话 +tmux attach -t <会话名> # 附加到tmux会话 +``` + +--- + +## 常用命令速查表 + +| 功能 | 命令 | +|------|------| +| 查看当前目录 | `pwd` | +| 列出文件 | `ls -lah` | +| 切换目录 | `cd <目录>` | +| 创建目录 | `mkdir -p dir1/dir2` | +| 删除文件 | `rm -rf <文件/目录>` | +| 复制文件 | `cp -r <源> <目标>` | +| 移动文件 | `mv <源> <目标>` | +| 查看文件 | `cat/less/more <文件>` | +| 查看头部 | `head -n 20 <文件>` | +| 查看尾部 | `tail -f <文件>` | +| 搜索文件 | `find . -name "*.txt"` | +| 搜索文本 | `grep -r "关键字" <目录>` | +| 查看进程 | `ps aux \| grep <进程>` | +| 终止进程 | `kill -9 ` | +| 查看内存 | `free -h` | +| 查看磁盘 | `df -h` | +| 查看网络 | `ifconfig` 或 `ip addr` | +| 测试网络 | `ping <主机>` | +| 压缩文件 | `tar -czf file.tar.gz dir/` | +| 解压文件 | `tar -xzf file.tar.gz` | +| 修改权限 | `chmod 755 <文件>` | +| 修改所有者 | `chown user:group <文件>` | +| 查看系统信息 | `uname -a` | +| 查看系统负载 | `uptime` | + +--- + +## 注意事项 + +1. **权限问题**:很多系统管理命令需要root权限(使用`sudo`) +2. **路径问题**:注意绝对路径和相对路径的区别 +3. **通配符**:`*` 匹配任意字符,`?` 匹配单个字符 +4. **危险命令**:`rm -rf`、`dd`、`mkfs` 等命令要谨慎使用 +5. **命令历史**:使用 `history` 查看,`Ctrl+R` 搜索 +6. **帮助文档**:使用 `man <命令>` 或 `<命令> --help` 查看帮助 + +--- + +## 参考资源 + +- [Linux命令大全](https://www.runoob.com/linux/linux-command-manual.html) +- [GNU Coreutils文档](https://www.gnu.org/software/coreutils/manual/) +- [Linux man pages](https://man7.org/linux/man-pages/) + +--- + +*最后更新:2024年* diff --git a/docs/adb调试命令/常用linux命令.md b/docs/adb调试命令/常用linux命令.md deleted file mode 100644 index e87671c..0000000 --- a/docs/adb调试命令/常用linux命令.md +++ /dev/null @@ -1,2863 +0,0 @@ -目录 - -一、进程管理 - -二、系统信息 - -三、关机 (系统的关机、重启以及登出 ) - -四、文件和目录 - -五、文件搜索 - -六、挂载一个文件系统 - -七、磁盘空间 - -八、系统负载 -- top - -九、用户和群组 - -十、文件的权限 - 使用 "+" 设置权限,使用 "-" 用于取消 - -十一、文件的特殊属性 - 使用 "+" 设置权限,使用 "-" 用于取消 - -十二、打包和压缩文件 - -十三、OS包管理器 - -①、RPM 包 - (Fedora, Redhat及类似系统) - -②、YUM 软件包升级器 - (Fedora, RedHat及类似系统) - -③、DEB 包 (Debian, Ubuntu 以及类似系统) - -④、APT 软件工具 (Debian, Ubuntu 以及类似系统) - -十四、文本查看、处理 - -①、查看文件内容 - -②、文本处理 - -十五、vim专题 - -①、大小写转换 - -②、字符串处理专题 - -③、vi中文本操作 - -④、vim基础操作 - -⑤、shell脚本中的注释(单行注释/多行注释) - -十五、字符设置和文件格式转换 - -十六、文件系统分析 - -十七、初始化一个文件系统 - -十八、SWAP文件系统 - -十九、备份 - -二十、光盘操作 - -二一、网络 - (以太网和WIFI无线) - -二二、JPS工具 - -二三、crontab调度器 - -①、语法 - -二四、Shell编程相关 - -①、内置变量 - -②、数据结构 - -1、数组 - -for i in in {1..10}; do rm -f hadoop-cmf-hive-HIVEMETASTORE-nn1.testhdp.com.log.out.$i;done - -2、字典dict 或 Map - -3、管道输出中执行下一条指令 - -4、循环、迭代逻辑控制 - -5、break 与 contine区别 - -6、大文件拆分处理 - -7、awk - -8、实现脚本中切换用户并执行该用户相关的命令操作 - -③、echo在shell中控制颜色&闪烁显示 - -1、在shell中显示色彩 - -​ - -二十五、程序开机自启动服务配置 - -二十六、持续监控Linux命令的执行情况 - -Linux和windows相比,很多管控都需要用命令来操作。windows以直观的可视化的方式操作,特别适合在桌面端PC上操作执行相应的软件。 - -而Linux命令行方式的操作,特别是在服务器端编程、管理、运维方面,更加简单、短小、精悍。短短一行组合命令,即可完成在windows需要各种加工、整合的复杂高效的功能操作。 - -一、进程管理 - -w 显示当前在线用户情况 - -my_adm pts/0    111.111.111.111    三15   24:58   2:51   0.02s sshd: my_admin [priv] - -root     pts/3    111.111.111.112      13:15    3:47m  0.35s  0.35s -bash - -my_adm pts/5    111.111.111.113    15:14    2.00s  0.54s  0.02s sshd: my_admin [priv] - -pkill -kill -t pts/??  杀掉指定名字的进程,如上述的pts/5 - -传送门:Linux中Kill进程的N种方法 - -二、系统信息 - -arch 显示机器的处理器架构(1) - -uname -m 显示机器的处理器架构(2) - -uname -r 显示正在使用的内核版本 - -dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI) - -hdparm -i /dev/hda 罗列一个磁盘的架构特性 - -hdparm -tT /dev/sda 在磁盘上执行测试性读取操作 - -cat /proc/cpuinfo 显示CPU info的信息 - -cat /proc/interrupts 显示中断 - -cat /proc/meminfo 校验内存使用 - -cat /proc/swaps 显示哪些swap被使用 - -cat /proc/version 显示内核的版本 - -cat /proc/net/dev 显示网络适配器及统计 - -cat /proc/mounts 显示已加载的文件系统 - -lspci -tv 罗列 PCI 设备 - -lsusb -tv 显示 USB 设备 - -date 显示系统日期 - -ctime=`date +%Y-%m-%dT%k:%M:%S` #格式化时间,如2018-01-13T11:09:19, 注意%k 与 %H的区别,前者返回9,后者返回09. - -YESTERDAY=`date +%Y-%m-%d -d "-1 days"` 获取昨日日期 - -cal 2007 显示2007年的日历表 - -date 041217002007.00 设置日期和时间 - 月日时分年.秒 - -clock -w 将时间修改保存到 BIOS - -查询网关地址(如将centos服务器网络获取类型由dhcp切换为static时,需要获取到ip及网关信息进行固化配置时会用到,如本地ip为10.34.0.123,则通过如下命令查询到网关为第一个3.254): - -[root@file-server ~]# netstat -rn - -Kernel IP routing table - -Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface - -0.0.0.0         10.34.3.254     0.0.0.0         UG        0 0          0 enp3g0 - -10.34.0.0       0.0.0.0         255.255.252.0   U         0 0          0 enp3g0 - -192.168.1.0     0.0.0.0         255.255.255.0   U         0 0          0 virbr0 - -CentOS / RedHat 系列,查看操作系统信息(如果没有lsb_release命令, 使用"yum install redhat-lsb"安装): - -[root@server-test online]# lsb_release -a - -LSB Version:    :core-4.1-amd64:core-4.1-noarch - -Distributor ID:    CentOS - -Description:    CentOS Linux release 7.5.1804 (Core) - -Release:    7.5.1804 - -Codename:    Core - -三、关机 (系统的关机、重启以及登出 ) - -shutdown -h now 关闭系统(1) - -init 0 关闭系统(2) - -telinit 0 关闭系统(3) - -shutdown -h hours:minutes & 按预定时间关闭系统 - -shutdown -c 取消按预定时间关闭系统 - -shutdown -r now 重启(1) - -reboot 重启(2) - -logout 注销 - -四、文件和目录 - -cd /home 进入 '/ home' 目录' - -cd .. 返回上一级目录 - -cd ../.. 返回上两级目录 - -cd 进入个人的主目录 - -cd ~user1 进入个人的主目录 - -cd - 返回上次所在的目录 - -pwd 显示工作路径 - -ls 查看目录中的文件 - -ls -F 查看目录中的文件 - -ls -l 显示文件和目录的详细资料 - -ls -a 显示隐藏文件 - -ls *[0-9]* 显示包含数字的文件名和目录名 - -tree 显示文件和目录由根目录开始的树形结构(1) - -lstree 显示文件和目录由根目录开始的树形结构(2) - -mkdir dir1 创建一个叫做 'dir1' 的目录' - -mkdir dir1 dir2 同时创建两个目录 - -mkdir -p /tmp/dir1/dir2 创建一个目录树 - -rm -f file1 删除一个叫做 'file1' 的文件' - -rmdir dir1 删除一个叫做 'dir1' 的目录' - -rm -rf dir1 删除一个叫做 'dir1' 的目录并同时删除其内容 - -rm -rf dir1 dir2 同时删除两个目录及它们的内容 - -mv dir1 new_dir 重命名/移动 一个目录 - -cp file1 file2 复制一个文件 - -cp dir/* . 复制一个目录下的所有文件到当前工作目录 - -cp -a /tmp/dir1 . 复制一个目录到当前工作目录 - -cp -a dir1 dir2 复制一个目录 - -ln -s file1 lnk1 创建一个指向文件或目录的软链接 - -ln file1 lnk1 创建一个指向文件或目录的物理链接 - -touch -t 0712250000 file1 修改一个文件或目录的时间戳 - (YYMMDDhhmm) - -file file1 outputs the mime type of the file as text - -iconv -l 列出已知的编码 - -iconv -f fromEncoding -t toEncoding inputFile > outputFile creates a new from the given input file by assuming it is encoded in fromEncoding and converting it to toEncoding. - -find . -maxdepth 1 -name *.jpg -print -exec convert "{}" -resize 80x60 "thumbs/{}" \; batch resize files in the current directory and send them to a thumbnails directory (requires convert from Imagemagick) - -五、文件搜索 - -find / -name file1 从 '/' 开始进入根文件系统搜索文件和目录 - -find / -user user1 搜索属于用户 'user1' 的文件和目录 - -find /home/user1 -name \*.bin 在目录 '/ home/user1' 中搜索带有'.bin' 结尾的文件 - -find /usr/bin -type f -atime +100 搜索在过去100天内未被使用过的执行文件 - -find /usr/bin -type f -mtime -10 搜索在10天内被创建或者修改过的文件 - -find / -name \*.rpm -exec chmod 755 '{}' \; 搜索以 '.rpm' 结尾的文件并定义其权限 ^                        find /tmp -name \*.hprof -exec rm -f {} \;批量删除java堆栈.hprof文件 - -find / -xdev -name \*.rpm 搜索以 '.rpm' 结尾的文件,忽略光驱、捷盘等可移动设备 - -locate \*.ps 寻找以 '.ps' 结尾的文件 - 先运行 'updatedb' 命令 - -whereis halt 显示一个二进制文件、源码或man的位置 - -which halt 显示一个二进制文件或可执行文件的完整路径 - -grep -rn "query_string" *  Linux目录下全局查找所有文件中是否包含指定字符串(-r:递归;-n:显示行号) - -六、挂载一个文件系统 - -mount /dev/hda2 /mnt/hda2 挂载一个叫做hda2的盘 - 确定目录 '/ mnt/hda2' 已经存在 - -umount /dev/hda2 卸载一个叫做hda2的盘 - 先从挂载点 '/ mnt/hda2' 退出 - -fuser -km /mnt/hda2 当设备繁忙时强制卸载 - -umount -n /mnt/hda2 运行卸载操作而不写入 /etc/mtab 文件- 当文件为只读或当磁盘写满时非常有用 - -mount /dev/fd0 /mnt/floppy 挂载一个软盘 - -mount /dev/cdrom /mnt/cdrom 挂载一个cdrom或dvdrom - -mount /dev/hdc /mnt/cdrecorder 挂载一个cdrw或dvdrom - -mount /dev/hdb /mnt/cdrecorder 挂载一个cdrw或dvdrom - -mount -o loop file.iso /mnt/cdrom 挂载一个文件或ISO镜像文件 - -mount -t vfat /dev/hda5 /mnt/hda5 挂载一个Windows FAT32文件系统 - -mount /dev/sda1 /mnt/usbdisk 挂载一个usb 捷盘或闪存设备 - -mount -t smbfs -o username=user,password=pass //WinClient/share /mnt/share 挂载一个windows网络共享 - -七、磁盘空间 - -df -h 显示已经挂载的分区列表 - -ls -lSr |more 以尺寸大小排列文件和目录 - -du -sh dir1 估算目录 'dir1' 已经使用的磁盘空间' - -du -sk * | sort -rn 以容量大小为依据依次显示文件和目录的大小 - -rpm -q -a --qf '%10{SIZE}t%{NAME}n' | sort -k1,1n 以大小为依据依次显示已安装的rpm包所使用的空间 (fedora, redhat类系统) - -dpkg-query -W -f='${Installed-Size;10}t${Package}n' | sort -k1,1n 以大小为依据显示已安装的deb包所使用的空间 (ubuntu, debian类系统) - -hdfs dfs -du /dw/default | sort -rn | head -n 10 | awk '{printf("%.2f\t\t%.2f\t\t%s\t\n",$1/1024/1024/1024,"\t"$2/1024/1024/1024,"\t"$3)}'  查询hdfs文件系统中表文件大小,按从大到小的顺序排列(取前10列),单位GB - -八、系统负载 -- top - -top -d 20 -p 1303                             将进程号1303的系统负载,每隔20秒刷新一次。英文状态下,按住c键,将展示进行的详细环境信息,对于java程序调试来说,非常友好。 - -top -d 20 -n 3 -b > test.txt                  每隔20秒,一共执行3次, 将统计结果导入到test.txt文件中。           - -top命令显示不全,添加-w参数: - -命令为: - -top -b -n 1 - --b为 批处理模式,-n为刷新的次数 - -发现信息显示不全,最后man top,加一个参数w后,完全显示 - -top -b -n 1 -w 512 - -如果需要显示完整的COMMAND命令,使用top -c参数 - -top -c -bw 500 - -查看完整进程名, 按500个字符长度查看(这样基本可以查看到完整的命令) - -其他参数列表,官方解释: - -1. COMMAND-LINE Options - -       The command-line syntax for top consists of: - -         -hv|-bcHiOSs -d secs -n max -u|U user -p pid -o fld -w [cols] - -       The typically mandatory switch ('-') and even whitespace are completely optional. - -       -h | -v  :Help/Version - -            Show library version and the usage prompt, then quit. - -       -b  :Batch-mode operation - -            Starts top in Batch mode, which could be useful for sending output from top to other programs or to a file.  In this mode, top will not accept input and runs until the iterations limit you've set with the `-n' command-line option or until killed. - -       -c  :Command-line/Program-name toggle - -            Starts top with the last remembered `c' state reversed.  Thus, if top was displaying command lines, now that field will show program names, and visa versa.  See the `c' interactive command for additional information. - -       -d  :Delay-time interval as:  -d ss.t (secs.tenths) - -            Specifies the delay between screen updates, and overrides the corresponding value in one's personal configuration file or the startup default.  Later this can be changed with the `d' or `s' interactive commands. - -            Fractional  seconds  are honored, but a negative number is not allowed.  In all cases, however, such changes are prohibited if top is running in Secure mode, except for root (unless the `s' command-line option was used).  For additional information on - -            Secure mode see topic 6a. SYSTEM Configuration File. - -       -H  :Threads-mode operation - -            Instructs top to display individual threads.  Without this command-line option a summation of all threads in each process is shown.  Later this can be changed with the `H' interactive command. - -       -i  :Idle-process toggle - -            Starts top with the last remembered `i' state reversed.  When this toggle is Off, tasks that have not used any CPU since the last update will not be displayed.  For additional information regarding this toggle see topic 4c. TASK AREA Commands, SIZE. - -       -n  :Number-of-iterations limit as:  -n number - -            Specifies the maximum number of iterations, or frames, top should produce before ending. - -       -o  :Override-sort-field as:  -o fieldname - -            Specifies the name of the field on which tasks will be sorted, independent of what is reflected in the configuration file.  You can prepend a `+' or `-' to the field name to also override the sort direction.  A leading `+' will force sorting  high  to - -            low, whereas a `-' will ensure a low to high ordering. - -            This option exists primarily to support automated/scripted batch mode operation. - -       -O  :Output-field-names - -            This option acts as a form of help for the above -o option.  It will cause top to print each of the available field names on a separate line, then quit.  Such names are subject to nls translation. - -       -p  :Monitor-PIDs mode as:  -pN1 -pN2 ...  or  -pN1,N2,N3 ... - -            Monitor only processes with specified process IDs.  This option can be given up to 20 times, or you can provide a comma delimited list with up to 20 pids.  Co-mingling both approaches is permitted. - -            A pid value of zero will be treated as the process id of the top program itself once it is running. - -            This is a command-line option only and should you wish to return to normal operation, it is not necessary to quit and restart top  --  just issue any of these interactive commands: `=', `u' or `U'. - -            The `p', `u' and `U' command-line options are mutually exclusive. - -       -s  :Secure-mode operation - -            Starts top with secure mode forced, even for root.  This mode is far better controlled through the system configuration file (see topic 6. FILES). - -       -S  :Cumulative-time toggle - -            Starts  top  with  the  last  remembered `S' state reversed.  When Cumulative time mode is On, each process is listed with the cpu time that it and its dead children have used.  See the `S' interactive command for additional information regarding this - -            mode. - -       -u | -U  :User-filter-mode as:  -u | -U number or name - -            Display only processes with a user id or user name matching that given.  The `-u' option matches on  effective user whereas the `-U' option matches on any user (real, effective, saved, or filesystem). - -            Prepending an exclamation point ('!') to the user id or name instructs top to display only processes with users not matching the one provided. - -            The `p', `u' and `U' command-line options are mutually exclusive. - -       -w  :Output-width-override as:  -w [ number ] - -            In Batch mode, when used without an argument top will format output using the COLUMNS= and LINES= environment variables, if set.  Otherwise, width will be fixed at the maximum 512 columns.  With an argument, output width can be decreased or  increased - -            (up to 512) but the number of rows is considered unlimited. - -            In normal display mode, when used without an argument top will attempt to format output using the COLUMNS= and LINES= environment variables, if set.  With an argument, output width can only be decreased, not increased.  Whether using environment vari‐ - -            ables or an argument with -w, when not in Batch mode actual terminal dimensions can never be exceeded. - -            Note: Without the use of this command-line option, output width is always based on the terminal at which top was invoked whether or not in Batch mode. - -九、用户和群组 - -groupadd group_name 创建一个新用户组 - -groupdel group_name 删除一个用户组 - -groupmod -n new_group_name old_group_name 重命名一个用户组 - -useradd -c "Name Surname " -g admin -d /home/user1 -s /bin/bash user1 创建一个属于 "admin" 用户组的用户 - -useradd user1 创建一个新用户 - -userdel -r user1 删除一个用户 ( '-r' 排除主目录) - -usermod -c "User FTP" -g system -d /ftp/user1 -s /bin/nologin user1 修改用户属性 - -passwd 修改口令 - -passwd user1 修改一个用户的口令 (只允许root执行) - -chage -E 2005-12-31 user1 设置用户口令的失效期限 - -pwck 检查 '/etc/passwd' 的文件格式和语法修正以及存在的用户 - -grpck 检查 '/etc/passwd' 的文件格式和语法修正以及存在的群组 - -newgrp group_name 登陆进一个新的群组以改变新创建文件的预设群组 - -案例 1: - -#### 1-创建用户、2-追加附加组、3-删除附加组 - -# 1 - -useradd san_zhang -m - -passwd san_zhang san_zhang@163.com - -# 从管道输出中修改密码(如果非root且可以转为root,请使用sudo) - -echo san_zhang@163.com | sudo passwd --stdin san_zhang - -#----------------------------------------------------- - -# 2 - -usermod -aG hdfs san_zhang (将san_zhang追加到附加组hdfs中(可以添加多个附加组,多个组之间用空格隔开,如"hdfs,yarn,spark"),其默认在san_zhang中) - -此时查看其所在的用户组,可以发现其所属组为san_zhang,附加组为hdfs,如下: - -id san_zhang - -uid=1001(san_zhang) gid=1001(san_zhang) groups=1001(san_zhang),992(hdfs) - -引申: - -如果上一步顺序写错,误将hdfs追加到san_zhang用户组中,如使用了如下错误的命令: - -usermod -aG san_zhang hdfs - -则此时查看hdfs所属组,就会发现其也在san_zhang组下了 - -id hdfs - -uid=995(hdfs) gid=992(hdfs) groups=992(hdfs),994(hadoop),1001(san_zhang) - -这时再查看san_zhang组,就会看到误加入的hdfs用户了 - -groups san_zhang - -san_zhang : san_zhang hdfs - -#----------------------------------------------------- - -# 3 - -gpasswd -d hdfs san_zhang (从san_zhang组中删除误加入的hdfs用户) - -执行后的日志:Removing user hdfs from group san_zhang - -#----------------------------------------------------- - -案例 2: - -统计某个分组下有哪些用户 - -[root@cdh01 ~]# grep hdfs /etc/group - -hdfs:x:993: - -[root@cdh01 ~]# awk -F : '{print $1,$4}' /etc/passwd | grep '993' - -hdfs 993 - -十、文件的权限 - 使用 "+" 设置权限,使用 "-" 用于取消 - -ls -lh 显示权限 - -ls /tmp | pr -T5 -W$COLUMNS 将终端划分成5栏显示 - -chmod ugo+rwx directory1 设置目录的所有人(u)、群组(g)以及其他人(o)以读(r )、写(w)和执行(x)的权限 - -chmod go-rwx directory1 删除群组(g)与其他人(o)对目录的读写执行权限 - -chown user1 file1 改变一个文件的所有人属性 - -chown -R user1 directory1 改变一个目录的所有人属性并同时改变改目录下所有文件的属性 - -chgrp group1 file1 改变文件的群组 - -chown user1:group1 file1 改变一个文件的所有人和群组属性 - -find / -perm -u+s 罗列一个系统中所有使用了SUID控制的文件 - -chmod u+s /bin/file1 设置一个二进制文件的 SUID 位 - 运行该文件的用户也被赋予和所有者同样的权限 - -chmod u-s /bin/file1 禁用一个二进制文件的 SUID位 - -chmod g+s /home/public 设置一个目录的SGID 位 - 类似SUID ,不过这是针对目录的 - -chmod g-s /home/public 禁用一个目录的 SGID 位 - -chmod o+t /home/public 设置一个文件的 STIKY 位 - 只允许合法所有人删除文件 - -chmod o-t /home/public 禁用一个目录的 STIKY 位 - -十一、文件的特殊属性 - 使用 "+" 设置权限,使用 "-" 用于取消 - -chattr +a file1 只允许以追加方式读写文件 - -chattr +c file1 允许这个文件能被内核自动压缩/解压 - -chattr +d file1 在进行文件系统备份时,dump程序将忽略这个文件 - -chattr +i file1 设置成不可变的文件,不能被删除、修改、重命名或者链接 - -chattr +s file1 允许一个文件被安全地删除 - -chattr +S file1 一旦应用程序对这个文件执行了写操作,使系统立刻把修改的结果写到磁盘 - -chattr +u file1 若文件被删除,系统会允许你在以后恢复这个被删除的文件 - -lsattr 显示特殊的属性 - -十二、打包和压缩文件 - -bunzip2 file1.bz2 解压一个叫做 'file1.bz2'的文件 - -bzip2 file1 压缩一个叫做 'file1' 的文件 - -gunzip file1.gz 解压一个叫做 'file1.gz'的文件 - -gzip file1 压缩一个叫做 'file1'的文件 - -gzip -9 file1 最大程度压缩 - -rar a file1.rar test_file 创建一个叫做 'file1.rar' 的包 - -rar a file1.rar file1 file2 dir1 同时压缩 'file1', 'file2' 以及目录 'dir1' - -unrar x file1.rar 解压rar包   #如果无unrar命令,参考:Linux CentOS 7.0 下 rar unrar的安装 - -tar -cvf archive.tar file1 创建一个非压缩的 tarball - -tar -cvf archive.tar file1 file2 dir1 创建一个包含了 'file1', 'file2' 以及 'dir1'的档案文件 - -tar -tf archive.tar 显示一个包中的内容 - -tar -xvf archive.tar 释放一个包 - -tar -xvf archive.tar -C /tmp 将压缩包释放到 /tmp目录下 - -tar -cvfj archive.tar.bz2 dir1 创建一个bzip2格式的压缩包 - -tar -jxvf archive.tar.bz2 解压一个bzip2格式的压缩包 - -tar -cvfz archive.tar.gz dir1 创建一个gzip格式的压缩包 - -tar -zxvf archive.tar.gz 解压一个gzip格式的压缩包 - -zip file1.zip file1 创建一个zip格式的压缩包 - -zip -r file1.zip file1 file2 dir1 将几个文件和目录同时压缩成一个zip格式的压缩包 - -unzip file1.zip 解压一个zip格式压缩包 - -十三、OS包管理器 - -①、RPM 包 - (Fedora, Redhat及类似系统) - -rpm -ivh package.rpm 安装一个rpm包 - -rpm -ivh --nodeps package.rpm 安装一个rpm包而忽略依赖关系警告 - -rpm -U package.rpm 更新一个rpm包但不改变其配置文件 - -rpm -F package.rpm 更新一个确定已经安装的rpm包 - -rpm -e [--nodeps] package_name.rpm 删除一个rpm包[--nodeps表示忽略依赖关系] - -rpm -qa 显示系统中所有已经安装的rpm包 - -rpm -qa | grep httpd 显示所有名称中包含 "httpd" 字样的rpm包 - -rpm -qi package_name 获取一个已安装包的特殊信息 - -rpm -qg "System Environment/Daemons" 显示一个组件的rpm包 - -rpm -ql package_name 显示一个已经安装的rpm包提供的文件列表 - -rpm -qc package_name 显示一个已经安装的rpm包提供的配置文件列表 - -rpm -q package_name --whatrequires 显示与一个rpm包存在依赖关系的列表 - -rpm -q package_name --whatprovides 显示一个rpm包所占的体积 - -rpm -q package_name --scripts 显示在安装/删除期间所执行的脚本l - -rpm -q package_name --changelog 显示一个rpm包的修改历史 - -rpm -qf /etc/httpd/conf/httpd.conf 确认所给的文件由哪个rpm包所提供 - -rpm -qp package.rpm -l 显示由一个尚未安装的rpm包提供的文件列表 - -rpm --import /media/cdrom/RPM-GPG-KEY 导入公钥数字证书 - -rpm --checksig package.rpm 确认一个rpm包的完整性 - -rpm -qa gpg-pubkey 确认已安装的所有rpm包的完整性 - -rpm -V package_name 检查文件尺寸、 许可、类型、所有者、群组、MD5检查以及最后修改时间 - -rpm -Va 检查系统中所有已安装的rpm包- 小心使用 - -rpm -Vp package.rpm 确认一个rpm包还未安装 - -rpm2cpio package.rpm | cpio --extract --make-directories *bin* 从一个rpm包运行可执行文件 - -rpm -ivh /usr/src/redhat/RPMS/`arch`/package.rpm 从一个rpm源码安装一个构建好的包 - -rpmbuild --rebuild package_name.src.rpm 从一个rpm源码构建一个 rpm 包 - -②、YUM 软件包升级器 - (Fedora, RedHat及类似系统) - -yum install package_name 下载并安装一个rpm包 (如: yum -y install zip unzip) - -yum localinstall package_name.rpm 将安装一个rpm包,使用你自己的软件仓库为你解决所有依赖关系 - -yum update package_name.rpm 更新当前系统中所有安装的rpm包 - -yum update package_name 更新一个rpm包 - -yum remove package_name 删除一个rpm包 - -yum list | grep tmux  列出所有可安裝的软件清单命令 - -yum search package_name 在rpm仓库中搜寻软件包 - -yum clean packages 清理rpm缓存删除下载的包 - -yum clean headers 删除所有头文件 - -yum clean all 删除所有缓存的包和头文件 - -③、DEB 包 (Debian, Ubuntu 以及类似系统) - -dpkg -i package.deb 安装/更新一个 deb 包 - -dpkg -r package_name 从系统删除一个 deb 包 - -dpkg -l 显示系统中所有已经安装的 deb 包 - -dpkg -l | grep httpd 显示所有名称中包含 "httpd" 字样的deb包 - -dpkg -s package_name 获得已经安装在系统中一个特殊包的信息 - -dpkg -L package_name 显示系统中已经安装的一个deb包所提供的文件列表 - -dpkg --contents package.deb 显示尚未安装的一个包所提供的文件列表 - -dpkg -S /bin/ping 确认所给的文件由哪个deb包提供 - -④、APT 软件工具 (Debian, Ubuntu 以及类似系统) - -apt-get install package_name 安装/更新一个 deb 包 - -apt-cdrom install package_name 从光盘安装/更新一个 deb 包 - -apt-get update 升级列表中的软件包 - -apt-get upgrade 升级所有已安装的软件 - -apt-get remove package_name 从系统删除一个deb包 - -apt-get check 确认依赖的软件仓库正确 - -apt-get clean 从下载的软件包中清理缓存 - -apt-cache search searched-package 返回包含所要搜索字符串的软件包名称 - -十四、文本查看、处理 - -①、查看文件内容 - -cat file1 从第一个字节开始正向查看文件的内容 - -tac file1 从最后一行开始反向查看一个文件的内容 - -more file1 查看一个长文件的内容 - -less file1 类似于 'more' 命令,但是它允许在文件中和正向操作一样的反向操作 - -head -2 file1 查看一个文件的前两行 - -tail -2 file1 查看一个文件的最后两行 - -tail -f /var/log/messages 实时查看被添加到一个文件中的内容 - -②、文本处理 - -cat file1 file2 ... | command <> file1_in.txt_or_file1_out.txt general syntax for text manipulation using PIPE, STDIN and STDOUT - -cat file1 | command( sed, grep, awk, grep, etc...) > result.txt 合并一个文件的详细说明文本,并将简介写入一个新文件中 - -cat file1 | command( sed, grep, awk, grep, etc...) >> result.txt 合并一个文件的详细说明文本,并将简介写入一个已有的文件中 - -grep Aug /var/log/messages 在文件 '/var/log/messages'中查找关键词"Aug" - -grep ^Aug /var/log/messages 在文件 '/var/log/messages'中查找以"Aug"开始的词汇 - -grep [0-9] /var/log/messages 选择 '/var/log/messages' 文件中所有包含数字的行 - -grep Aug -R /var/log/* 在目录 '/var/log' 及随后的目录中搜索字符串"Aug" - -grep -E 'string_1|string_2' /var/log/test.log 在日志中同时查询包含 string_1或包含string_2的记录 - -# 匹配redis中, field 中包含以1到4位数字开头,以"_已下单"结尾的字符, 并将其 value 值带出来(-A1) - -redis-cli -h 111.111.111.111 -p 7001 -c -a ${PASSWORD} --raw hgetall 2022-03-24_ORDER_STAT | grep -E "^[[:digit:]]{1,4}_已下单" -A1 - -grep -Hnr docker * 在本层或子文件夹里递归查找包含指定字符“docker”的文件,并显示文件名+行号,如果精确匹配文本,加o参数。参数含义:(H:每次匹配时将文件名打印出来;n:打印字符串所在的行号;r:递归查找;o:精确匹配到单词,多一个字符都不行) - -“grep显示匹配行的上下行内容”专题: - -grep -A2 2 test.txt  返回匹配行和匹配行的后两行 - -grep -B2 2 test.txt  返回匹配行和匹配行的前两行 - -grep -C2 2 text.txt 或者 grep -A2 -B2 2 test.txt 返回匹配行和匹配行的前后两行 - --A -B -C 后面跟阿拉伯数字 - --A 返回匹配后和它后面的n行,(After,之后)。 - --B 返回匹配行和它前面的n行,(Before,之前)。 - --C 返回匹配行和它前后各n行,通-A和-B联用,(Context,上下文即前后)。 - -sed -i 's/string1/string2/g' example.txt 将example.txt文件中的 "string1" 替换成 "string2"(如果不加-i参数,则在内存中替换; 添加-i参数,则在文件中直接替换) - -sed '/^$/d' example.txt 从example.txt文件中删除所有空白行 - -sed '/ *#/d; /^$/d' example.txt 从example.txt文件中删除所有注释和空白行 - -echo 'hElloWorld' | tr '[:lower:]' '[:upper:]' 找出所有的小写字母并全部替换为大写字母 - -sed -e '1d' result.txt 从文件example.txt 中排除第一行 - -sed -n '/string1/p' 查看只包含词汇 "string1"的行 - -sed -e 's/ *$//' example.txt 删除每一行最后的空白字符 - -sed -e 's/string1//g' example.txt 从文档中只删除词汇 "string1" 并保留剩余全部 - -sed -n '1,5p;5q' example.txt 查看从第一行到第5行内容 - -sed -n '5p;5q' example.txt 查看第5行 - -sed -e 's/00*/0/g' example.txt 用单个零替换多个零 - -sed -i '3i helloword' test.txt   在test.txt文件的第三行插入‘helloword’字符串 - -“sed按指定字符串删除”专题: - -用sed删除匹配到字符串的行: - -语法:sed-i'/关键字符/d'文件名 - -举例1:匹配"\etc\install.sh" - -set -i '/\/etc\/install.sh/d' 1.txt - -/ 搜索 - -匹配\/etc\/install.sh,就是“/etc/install.sh” - --i 表示操作在源文件上生效.否则操作内存中数据,并不写入文件中. - -在分号内的/d表示删除匹配的行。 - -举例2: - -删除以a开头的行 - -sed -i '/^a.*/d' tmp.txt - -^a表示开头是a, .*表示后跟任意字符串 - -Example-1:  使用sed进行文本批量替换 - -#!/bin/bash - -ddl_file_path=/c/Users/user/Downloads/sqoop_data/hive_2_mysql - -ls $ddl_file_path | while read f; - -do - -echo "--------->"$ddl_file_path/$f - -## Template - -#sed -i 's///g' $ddl_file_path/$f - -#sed -i "s///g" $ddl_file_path/$f - -sed -i 's/111.111.111.111:3306/222.222.222.222:3307/g' $ddl_file_path/$f - -sed -i "s/'password_1'/'password_2'/g" $ddl_file_path/$f - -done - -# echo -e "=========>\n\t Files contains keyword "/WARN:" in path $ddl_file_path are deleted!!!" - -#!/bin/bash - -set -x - -## Template - -#sed -i 's///g' $ddl_file_path/$f - -#sed -i "s///g" $ddl_file_path/$f - -## Func 1 - 实现在所有文件的第四行、第五行插入指定文本 - -ddl_file_path=/e/迅雷下载/user_data_after - -ls $ddl_file_path | while read f; - -do    - -    # 如果文件不是文件夹类型,才允许插入操作 - -    if [ ! -d $f ];then - -        echo "--------->"$ddl_file_path/$f - -        sed -i '4i retries=10' $ddl_file_path/$f - -        sed -i '5i retry.backoff=3' $ddl_file_path/$f - -    fi - -done - -## Func 2 - 如果文件夹不存在,则创建;反之提示文件已存在 - -if [ ! -d "beijing" ];then - -    mkdir beijing - -else - -    echo "File already exists" - -fi - -文件类型的参数判别大全: - -shell脚本判断文件类型 - -shell判断文件,目录是否存在或者具有权限 - -#!/bin/sh - -myPath="/var/log/httpd/" - -myFile="/var/log/httpd/access.log" - -# 这里的-x 参数判断$myPath是否存在并且是否具有可执行权限 - -if [ ! -x "$myPath"]; then - -mkdir "$myPath" - - fi - - # 这里的-d 参数判断$myPath是否存在 - - if [ ! -d "$myPath"]; then - - mkdir "$myPath" - - fi - - # 这里的-f参数判断$myFile是否存在 - - if [ ! -f "$myFile" ]; then - - touch "$myFile" - - fi - - # 其他参数还有-n,-n是判断一个变量是否是否有值 - - if [ ! -n "$myVar" ]; then - - echo "$myVar is empty" - - exit 0 - - fi - - # 两个变量判断是否相等 - - if [ "$var1" = "$var2" ]; then - - echo '$var1 eq $var2' - - else - - echo '$var1 not eq $var2' - - fi - -文件的判别逻辑大全: - --------------------------------------------------------------------- - --a file exists. - --b file exists and is a block special file. - --c file exists and is a character special file. - --d file exists and is a directory. - --e file exists (just the same as -a). - --f file exists and is a regular file. - --g file exists and has its setgid(2) bit set. - --G file exists and has the same group ID as this process. - --k file exists and has its sticky bit set. - --L file exists and is a symbolic link. - --n string length is not zero. - --o Named option is set on. - --O file exists and is owned by the user ID of this process. - --p file exists and is a first in, first out (FIFO) special file or - -named pipe. - --r file exists and is readable by the current process. - --s file exists and has a size greater than zero. - --S file exists and is a socket. - --t file descriptor number fildes is open and associated with a - -terminal device. - --u file exists and has its setuid(2) bit set. - --w file exists and is writable by the current process. - --x file exists and is executable by the current process. - --z string length is zero. - -注意-s 和 -f 参数的区别 - -cat -n file1 标示文件的行数 - -cat example.txt | awk 'NR%2==1' 删除example.txt文件中的所有偶数行 - -echo a b c | awk '{print $1}' 查看一行第一栏 - -echo a b c | awk '{print $1,$3}' 查看一行的第一和第三栏 - -paste file1 file2 合并两个文件或两栏的内容 - -paste -d '+' file1 file2 合并两个文件或两栏的内容,中间用"+"区分 - -sort file1 file2 排序两个文件的内容 - -sort file1 file2 | uniq 取出两个文件的并集(重复的行只保留一份) - -sort file1 file2 | uniq -u 删除交集,留下其他的行 - -sort file1 file2 | uniq -d 取出两个文件的交集(只留下同时存在于两个文件中的文件) - -comm -1 file1 file2 比较两个文件的内容只删除 'file1' 所包含的内容 - -comm -2 file1 file2 比较两个文件的内容只删除 'file2' 所包含的内容 - -comm -3 file1 file2 比较两个文件的内容只删除两个文件共有的部分 - -综合案例: - -①:本机tcp各种状态数统计 - -netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' - -CLOSE_WAIT 2 - -ESTABLISHED 276 - -SYN_SENT 2 - -TIME_WAIT 63270 - -awk 'BEGIN { - -   sum = 0; for (i = 0; i < 20; ++i) { - -      sum += i; if (sum > 50) exit(10); else print "Sum =", sum - -   } - -}' - -②:使用cut提取文本字符串: - -按“:”分割,提取/etc/passwd中第1,3,4,5列数据,按原分隔符":"进行拼接。 - -[hdfs@cdh01 test]$ head -n 5 /etc/passwd | cut -d : -f 1,3-5 - -root:0:0:root - -bin:1:1:bin - -daemon:2:2:daemon - -adm:3:4:adm - -xixi:4:7:xixi - -③:使用uniq进行滤重 - -cut的具体用法,如下: - -A).去除重复行 - -sort target_file | uniq - -B).查找非重复行 - -sort target_file | uniq -u - -C).查找重复行 - -sort target_file | uniq -d - -D).统计每一个文件出现的次数 - -sort target_file | uniq -c - -④:排序 - -sort linux下的排序工具 - - 参数说明: - --r降序排列 - --u去重 - --n以数字大小排序(默认是首字母排序) - --t指定分隔符 这里我们指定'|'为分隔符 - --k指定分隔后的第几位进行排序 这里我们指定第2位 - -任务:report.txt文件里有以下内容:记录了一些方法的执行时间,要求按执行时间降序排列. - -命令:sort -run -k 2 -t '|' report.txt - - 1 void com.dustpan.zeus.core.service.MergeService.startService(int)|2 - - 2 void com.dustpan.zeus.core.service.InitShopDateService.startService(int)|1 - - 3 boolean com.dustpan.zeus.core.service.MergeService.executeGePrintSyncTask()|475 - - 4 boolean com.dustpan.zeus.core.service.InitShopDateService.executeInitShopTask()|96 - - 5 boolean com.dustpan.zeus.core.service.MergeService.executeGePrintSyncTask()|1013 - - 6 boolean com.dustpan.zeus.core.service.InitShopDateService.executeInitShopTask()|184 - - 7 boolean com.dustpan.zeus.core.service.MergeService.executeGePrintSyncTask()|729 - - 8 boolean com.dustpan.zeus.core.service.InitShopDateService.executeInitShopTask()|14 - - 9 boolean com.dustpan.zeus.core.service.MergeService.executeGePrintSyncTask()|394 - -10 boolean com.dustpan.zeus.core.service.InitShopDateService.executeInitShopTask()|90 - -11 boolean com.dustpan.zeus.core.service.MergeService.executeGePrintSyncTask()|569 - -12 boolean com.dustpan.zeus.core.service.InitShopDateService.executeInitShopTask()|796 - -13 boolean com.dustpan.zeus.core.service.MergeService.executeGePrintSyncTask()|1648 - -14 boolean com.dustpan.zeus.core.service.InitShopDateService.executeInitShopTask()|82 - -15 boolean com.dustpan.zeus.core.service.MergeService.executeGePrintSyncTask()|1018 - -16 boolean com.dustpan.zeus.core.service.InitShopDateService.executeInitShopTask()|14 - -17 boolean com.dustpan.zeus.core.service.MergeService.executeGePrintSyncTask()|937 - -18 boolean com.dustpan.zeus.core.service.InitShopDateService.executeInitShopTask()|17 - -19 boolean com.dustpan.zeus.core.service.MergeService.executeGePrintSyncTask()|601 - -20 boolean com.dustpan.zeus.core.service.InitShopDateService.executeInitShopTask()|52 - -21 boolean com.dustpan.zeus.core.service.MergeService.executeGePrintSyncTask()|5081 - -22 boolean com.dustpan.zeus.core.service.InitShopDateService.executeInitShopTask()|388 - -23 boolean com.dustpan.zeus.core.service.MergeService.executeGePrintSyncTask()|198 - -24 boolean com.dustpan.zeus.core.service.InitShopDateService.executeInitShopTask()|11 - -25 boolean com.dustpan.zeus.core.service.MergeService.executeGePrintSyncTask()|203 - -26 boolean com.dustpan.zeus.core.service.InitShopDateService.executeInitShopTask()|11 - -27 boolean com.dustpan.zeus.core.service.MergeService.executeGePrintSyncTask()|241 - -28 boolean com.dustpan.zeus.core.service.InitShopDateService.executeInitShopTask()|13 - -29 boolean com.dustpan.zeus.core.service.MergeService.executeGePrintSyncTask()|176 - -30 boolean com.dustpan.zeus.core.service.InitShopDateService.executeInitShopTask()|12 - -31 boolean com.dustpan.zeus.core.service.MergeService.executeGePrintSyncTask()|206 - -32 boolean com.dustpan.zeus.core.service.InitShopDateService.executeInitShopTask()|33 - -33 boolean com.dustpan.zeus.core.service.MergeService.executeGePrintSyncTask()|242 - -34 boolean com.dustpan.zeus.core.service.InitShopDateService.executeInitShopTask()|19 - -案例一、找出本文件夹中包含my_test_calendar关键字的所有文件(含全路径+文件名),并滤重。 - -查询hive_sh目录下,包含搜索关键字'my_test_calendar'的文本出现的文件及关键字所在的行,将文件(文件路径+文件名) 字段提取出来,并做滤重处理。 - -[hdfs@nn1 hive_sh]$ find . -type f | xargs grep -rn 'my_test_calendar' | cut -d : -f 1 | uniq - -案例二、查找所有出现指定文本的文件并滤重(进阶版) - -#### # 脚本说明 - -#### - -#### 遍历 hive_tables.txt 文件中的所有表(如 hive_table_1),查找其在指定目录/data/program/hive_sh/下的文件中,是否使用到。如果查到重复出现该文本的文件,做滤重处理。 - -#### - -#### cat query_table_usage_in_hive.sh - -#### ----------------------------------------------- - -#!/bin/bash - -while read tbl - -do - -echo ------------------Handle table: $tbl-------------- - -find /data/program/hive_sh/ -type f | xargs grep -rn $tbl | cut -d : -f 1 | uniq > ./output/${tbl}_result.txt - -done < hive_tables.txt - -案例三、查找内存耗用top3的app - -ps auxw | head -1;ps auxw|sort -rn -k4|head -5 - -十五、vim专题 - -①、大小写转换 - -: vim大小写转换_郭耀今 -- 蓝天白云-CSDN博客_vim大写转小写 - -②、字符串处理专题 - -总结: - -掐头(删左侧: ①#:删左侧;②##:贪婪删左侧)去尾(删右侧: ①%:删右边;②%%:贪婪删右侧) - -1、linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 ) - -2、Linux Bash Shell字符串截取 - -3、Shell 截取字符串 - -4、shell脚本字符串截取的8种方法 - -5. Linux-shell脚本字符串截取 - -6. linux中shell变量$#,$@,$0,$1,$2的含义解释/Shell中的${}、##和%%使用范例/export - -7.Shell 命令中的特殊替换、模式匹配替换、字符串提取和替换 - -8.shell变量里的字符替换 - -③、vi中文本操作 - -vi/vim 中在每行行首或行尾插入指定字符串 - -行首 :%s/^/your_word/ - -行尾 :%s/$/your_word/ - -按键操作: - -注释(列模式方式):ctrl+v 进入列编辑模式,向下或向上移动光标,把需要注释的行的开头标记起来,然后按大写的I,再插入注释符,比如”#”,再按Esc,就会全部注释了。 - -删除:先按v,进入visual模式,横向选中列的个数(如”#”注释符号,需要选中两列),再按Esc,再按ctrl+v 进入列编辑模式,向下或向上移动光标,选中注释部分,然后按d, 就会删除注释符号(#)。 - -PS:当然不一定是shell的注释符”#”,也可以是”//”,或者其他任意的字符;vim才不知道什么是注释符呢,都是字符而已。 - -案例: - -vim 列编辑模式 - -使用替换命令: - -替换命令语法: - -:[addr]s/源字符串/目标字符串/[option] - -全局替换: - -:%s/源字符串/目标字符串/g - -参数说明: - -[addr]——表示检索范围,省略时表示当前行。 - -"%":表示整个文件,同"1,$"; - -".,$":从当前行到文件尾; - -s:表示替换操作 - -[option]:表示操作类型 - -g:全局替换 - -c:表示进行确认 - -p:表示替换结果逐行显示(Ctrl+L恢复屏幕) - -省略option:默认仅对每行第一个匹配串进行替换 - -如果在源字符串和目标字符串中有特殊字符,需要使用“\”转义 - -举例: - -在全部内容的行首添加//号注释 - -:% s/^/\/\//g - -在2~50行首添加//号注释 - -:2,50 s/^/\/\//g - -在2~50行首删除//号 - -:2,50 s/^\/\///g - -全局替换(全文替换、全部替换): - -:%s/原字符/希望替换的字符/g - -④、vim基础操作 - -在命令模式下: - -1、填到指定行,如5 - -:5 - -2、跳到最后一行 - -G(shift + g) - -3、跳到行首 - -gg - -4、转到第N行,如第7行 - -7G - -5、删除所有内容 - -A).使用shift+g转到最后一行 - -B).命令模式下输入:1,.d - -引申:深处第3行到最后一行 - -A).使用shift+g转到最后一行 - -B).命令模式下输入:3,.d - -6、删除光标所在字符 - -x - -7、删除表过所在前的字符(大写X) - -X - -8、删除到下一个单词开头 - -dw - -9、删除到本单词末尾 - -de - -10、删除到本单词末尾包括标点在内 - -dE - -11、删除到前一个单词 - -db - -12、删除到前一个单词包括标点在内 - -dB - -13、删除一整行 - -dd - -14、删除光标位置到本行结尾 - -ud$ - -15、删除光标位置到本行开头 - -d0 - -在vim中 ,“.”当前行 ,“1,.”表示从第一行到当前行 ,“d”删除,3dd代表删除三行。 - -16、vim 统计单词匹配数量 - -:%s/hello world/&/gn - -上句统计hello world 在全文出现的次数 - -如果要统计从50行到100行,出现的次数,则使用: - -:50,100s/hello world//gn - -⑤、shell脚本中的注释(单行注释/多行注释) - -1、单行注释 - -"#" 置于行首位置 - -2、多行注释 - -A) 方式一 - -:< page.html 将一个文本文件转换成html - -recode -l | more 显示所有允许的转换格式 - -十六、文件系统分析 - -badblocks -v /dev/hda1 检查磁盘hda1上的坏磁块 - -fsck /dev/hda1 修复/检查hda1磁盘上linux文件系统的完整性 - -fsck.ext2 /dev/hda1 修复/检查hda1磁盘上ext2文件系统的完整性 - -e2fsck /dev/hda1 修复/检查hda1磁盘上ext2文件系统的完整性 - -e2fsck -j /dev/hda1 修复/检查hda1磁盘上ext3文件系统的完整性 - -fsck.ext3 /dev/hda1 修复/检查hda1磁盘上ext3文件系统的完整性 - -fsck.vfat /dev/hda1 修复/检查hda1磁盘上fat文件系统的完整性 - -fsck.msdos /dev/hda1 修复/检查hda1磁盘上dos文件系统的完整性 - -dosfsck /dev/hda1 修复/检查hda1磁盘上dos文件系统的完整性 - -十七、初始化一个文件系统 - -mkfs /dev/hda1 在hda1分区创建一个文件系统 - -mke2fs /dev/hda1 在hda1分区创建一个linux ext2的文件系统 - -mke2fs -j /dev/hda1 在hda1分区创建一个linux ext3(日志型)的文件系统 - -mkfs -t vfat 32 -F /dev/hda1 创建一个 FAT32 文件系统 - -fdformat -n /dev/fd0 格式化一个软盘 - -mkswap /dev/hda3 创建一个swap文件系统 - -十八、SWAP文件系统 - -mkswap /dev/hda3 创建一个swap文件系统 - -swapon /dev/hda3 启用一个新的swap文件系统 - -swapon /dev/hda2 /dev/hdb3 启用两个swap分区 - -十九、备份 - -dump -0aj -f /tmp/home0.bak /home 制作一个 '/home' 目录的完整备份 - -dump -1aj -f /tmp/home0.bak /home 制作一个 '/home' 目录的交互式备份 - -restore -if /tmp/home0.bak 还原一个交互式备份 - -rsync -rogpav --delete /home /tmp 同步两边的目录 - -rsync -rogpav -e ssh --delete /home ip_address:/tmp 通过SSH通道rsync - -rsync -az -e ssh --delete ip_addr:/home/public /home/local 通过ssh和压缩将一个远程目录同步到本地目录 - -rsync -az -e ssh --delete /home/local ip_addr:/home/public 通过ssh和压缩将本地目录同步到远程目录 - -dd bs=1M if=/dev/hda | gzip | ssh user@ip_addr 'dd of=hda.gz' 通过ssh在远程主机上执行一次备份本地磁盘的操作 - -dd if=/dev/sda of=/tmp/file1 备份磁盘内容到一个文件 - -tar -Puf backup.tar /home/user 执行一次对 '/home/user' 目录的交互式备份操作 - -( cd /tmp/local/ && tar c . ) | ssh -C user@ip_addr 'cd /home/share/ && tar x -p' 通过ssh在远程目录中复制一个目录内容 - -( tar c /home ) | ssh -C user@ip_addr 'cd /home/backup-home && tar x -p' 通过ssh在远程目录中复制一个本地目录 - -tar cf - . | (cd /tmp/backup ; tar xf - ) 本地将一个目录复制到另一个地方,保留原有权限及链接 - -find /home/user1 -name '*.txt' | xargs cp -av --target-directory=/home/backup/ --parents 从一个目录查找并复制所有以 '.txt' 结尾的文件到另一个目录 - -find /var/log -name '*.log' | tar cv --files-from=- | bzip2 > log.tar.bz2 查找所有以 '.log' 结尾的文件并做成一个bzip包 - -dd if=/dev/hda of=/dev/fd0 bs=512 count=1 做一个将 MBR (Master Boot Record)内容复制到软盘的动作 - -dd if=/dev/fd0 of=/dev/hda bs=512 count=1 从已经保存到软盘的备份中恢复MBR内容 - -二十、光盘操作 - -cdrecord -v gracetime=2 dev=/dev/cdrom -eject blank=fast -force 清空一个可复写的光盘内容 - -mkisofs /dev/cdrom > cd.iso 在磁盘上创建一个光盘的iso镜像文件 - -mkisofs /dev/cdrom | gzip > cd_iso.gz 在磁盘上创建一个压缩了的光盘iso镜像文件 - -mkisofs -J -allow-leading-dots -R -V "Label CD" -iso-level 4 -o ./cd.iso data_cd 创建一个目录的iso镜像文件 - -cdrecord -v dev=/dev/cdrom cd.iso 刻录一个ISO镜像文件 - -gzip -dc cd_iso.gz | cdrecord dev=/dev/cdrom - 刻录一个压缩了的ISO镜像文件 - -mount -o loop cd.iso /mnt/iso 挂载一个ISO镜像文件 - -cd-paranoia -B 从一个CD光盘转录音轨到 wav 文件中 - -cd-paranoia -- "-3" 从一个CD光盘转录音轨到 wav 文件中(参数-3) - -cdrecord --scanbus 扫描总线以识别scsi通道 - -dd if=/dev/hdc | md5sum 校验一个设备的md5sum编码,例如一张 CD - -二一、网络 - (以太网和WIFI无线) - -ifconfig eth0 显示一个以太网卡的配置 - -ifup eth0 启用一个 'eth0' 网络设备 - -ifdown eth0 禁用一个 'eth0' 网络设备 - -ifconfig eth0 192.168.1.1 netmask 255.255.255.0 控制IP地址 - -ifconfig eth0 promisc 设置 'eth0' 成混杂模式以嗅探数据包 (sniffing) - -dhclient eth0 以dhcp模式启用 'eth0' - -route -n show routing table - -route add -net 0/0 gw IP_Gateway configura default gateway - -route add -net 192.168.0.0 netmask 255.255.0.0 gw 192.168.1.1 configure static route to reach network '192.168.0.0/16' - -route del 0/0 gw IP_gateway remove static route - -echo "1" > /proc/sys/net/ipv4/ip_forward activate ip routing - -hostname show hostname of system - -host [www.example.com](http://www.example.com) lookup hostname to resolve name to ip address and viceversa(1) - -nslookup [www.example.com](http://www.example.com) lookup hostname to resolve name to ip address and viceversa(2) - -ip link show show link status of all interfaces - -mii-tool eth0 show link status of 'eth0' - -ethtool eth0 show statistics of network card 'eth0' - -netstat -tup show all active network connections and their PID - -netstat -tupl show all network services listening on the system and their PID - -tcpdump tcp port 80 show all HTTP traffic - -iwlist scan show wireless networks - -iwconfig eth1 show configuration of a wireless network card - -hostname show hostname - -host [www.example.com](http://www.example.com) lookup hostname to resolve name to ip address and viceversa - -nslookup [www.example.com](http://www.example.com) lookup hostname to resolve name to ip address and viceversa - -whois [www.example.com](http://www.example.com) lookup on Whois database - -二二、JPS工具 - -jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上简单察看当前java进程的一些简单情况。 - -    我想很多人都是用过unix系统里的ps命令,这个命令主要是用来显示当前系统的进程情况,有哪些进程,及其 id。 jps 也是一样,它的作用是显示当前系统的java进程情况,及其id号。我们可以通过它来查看我们到底启动了几个java进程(因为每一个java程序都会独占一个java虚拟机实例),和他们的进程号(为下面几个程序做准备),并可通过opt来查看这些进程的详细启动参数。 - -     使用方法:在当前命令行下打 jps(需要JAVA_HOME,没有的话,到改程序的目录下打) 。 - -jps存放在JAVA_HOME/bin/jps,使用时为了方便请将JAVA_HOME/bin/加入到Path. - -$> jps - -23991 Jps - -23789 BossMain - -23651 Resin - -比较常用的参数: - --q 只显示pid,不显示class名称,jar文件名和传递给main 方法的参数 - -$>  jps -q - -28680 - -23789 - -23651 - --m 输出传递给main 方法的参数,在嵌入式jvm上可能是null - -$> jps -m - -28715 Jps -m - -23789 BossMain - -23651 Resin -socketwait 32768 -stdout /data/aoxj/resin/log/stdout.log -stderr /data/aoxj/resin/log/stderr.log - --l 输出应用程序main class的完整package名 或者 应用程序的jar文件完整路径名 - -$> jps -l - -28729 sun.tools.jps.Jps - -23789 com.asiainfo.aimc.bossbi.BossMain - -23651 com.caucho.server.resin.Resin - --v 输出传递给JVM的参数 - -$> jps -v - -23789 BossMain - -28802 Jps -Denv.class.path=/data/aoxj/bossbi/twsecurity/java/trustwork140.jar:/data/aoxj/bossbi/twsecurity/java/:/data/aoxj/bossbi/twsecurity/java/twcmcc.jar:/data/aoxj/jdk15/lib/rt.jar:/data/aoxj/jd - -k15/lib/tools.jar -Dapplication.home=/data/aoxj/jdk15 -Xms8m - -23651 Resin -Xss1m -Dresin.home=/data/aoxj/resin -Dserver.root=/data/aoxj/resin -Djava.util.logging.manager=com.caucho.log.LogManagerImpl - - -Djavax.management.builder.initial=com.caucho.jmx.MBeanServerBuilderImpl - -sudo jps看到的进程数量最全 - -jps 192.168.0.77 - -列出远程服务器192.168.0.77机器所有的jvm实例,采用rmi协议,默认连接端口为1099 - -(前提是远程服务器提供jstatd服务) - -注:jps命令有个地方很不好,似乎只能显示当前用户的java进程,要显示其他用户的还是只能用unix/linux的ps命令。 - -详细情况请参考sun官方文档。 - -[http://java.sun.com/j2se/1.7.0/docs/tooldocs/share/jps.html](http://java.sun.com/j2se/1.7.0/docs/tooldocs/share/jps.html) - -GO TOP INDEX ^ - -Microsoft Windows networks (SAMBA) - -nbtscan ip_addr netbios name resolution - -nmblookup -A ip_addr netbios name resolution - -smbclient -L ip_addr/hostname show remote shares of a windows host - -smbget -Rr smb://ip_addr/share like wget can download files from a host windows via smb - -mount -t smbfs -o username=user,password=pass //WinClient/share /mnt/share mount a windows network share - --b file            若文件存在且是一个块特殊文件,则为真 - --c file            若文件存在且是一个字符特殊文件,则为真 - --d file            若文件存在且是一个目录,则为真 - --e file            若文件存在,则为真 - --f file            若文件存在且是一个规则文件,则为真 - --g file            若文件存在且设置了SGID位的值,则为真 - --h file            若文件存在且为一个符合链接,则为真 - --k file            若文件存在且设置了"sticky"位的值 - --p file            若文件存在且为一已命名管道,则为真 - --r file            若文件存在且可读,则为真 - --s file            若文件存在且其大小大于零,则为真 - --u file            若文件存在且设置了SUID位,则为真 - --w file            若文件存在且可写,则为真 - --x file            若文件存在且可执行,则为真 - --o file            若文件存在且被有效用户ID所拥有,则为真 - --z string          若string长度为0,则为真 - --n string          若string长度不为0,则为真 - -string1 = string2  若两个字符串相等,则为真 - -string1 != string2 若两个字符串不相等,则为真 - -int1 -eq int2      若int1等于int2,则为真 - -int1 -ne int2      若int1不等于int2,则为真 - -int1 -lt int2      若int1小于int2,则为真 - -int1 -le int2      若int1小于等于int2,则为真 - -int1 -gt int2      若int1大于int2,则为真 - -int1 -ge int2      若int1大于等于int2,则为真 - -!expr              若expr为假则复合表达式为真。expr可以是任何有效的测试表达式 - -expr1 -a expr2     若expr1和expr2都为真则整式为真 - -expr1 -o expr2     若expr1和expr2有一个为真则整式为真 - -特殊变量 - -$0                 正在被执行命令的名字。对于shell脚本而言,这是被激活命令的路径 - -$n                 该变量与脚本被激活时所带的参数相对应。n是正整数,与参数位置相对应($1,$2…) - -$#                 提供脚本的参数号 - -$*                 所有这些参数都被双引号引住。若一个脚本接收两个参数,$*等于$1$2 - -$@                 所有这些参数都分别被双引号引住。若一个脚本接收到两个参数,$@等价于$1$2 - -$?                 前一个命令执行后的退出状态, 常用于判断上一个命令的执行结果, 以辅助判断下游分支逻辑的执行 - -$$                 当前shell的进程号。对于shell脚本,这是其正在执行时的进程ID - -$!                 前一个后台命令的进程号 - -二三、crontab调度器 - -①、语法 - -Linux下的任务调度分为两类:系统任务调度和用户任务调度。Linux系统任务是由 cron (crond) 这个系统服务来控制的,这个系统服务是默认启动的。用户自己设置的计划任务则使用crontab 命令。在CentOS系统中: - -cat /etc/crontab - -SHELL=/bin/bash - -PATH=/sbin:/bin:/usr/sbin:/usr/bin - -MAILTO=root - -HOME=/ - -# For details see man 4 crontabs - -# Example of job definition: - -# .---------------- minute (0 - 59) - -# | .------------- hour (0 - 23) - -# | | .---------- day of month (1 - 31) - -# | | | .------- month (1 - 12) OR jan,feb,mar,apr ... - -# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat - -# | | | | | - -# * * * * * user-name command to be executed - -前四行是用来配置crond任务运行的环境变量: - -》第一行SHELL变量指定了系统要使用哪个shell,这里是bash; - -》第二行PATH变量指定了系统执行命令的路径; - -》第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户; - -》第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。 - -用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。 - -用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段: - -》前五段是时间设定段; - -》第六段是要执行的命令段 - -crontab表达式 格式如下: - -minute hour day month week command - -在以上各个字段中,还可以使用以下特殊字符: - -"*"代表所有的取值范围内的数字,如月份字段为*,则表示1到12个月; - -"/"代表每一定时间间隔的意思,如分钟字段为*/10,表示每10分钟执行1次。 - -"-"代表从某个区间范围,是闭区间。如“2-5”表示“2,3,4,5”,小时字段中0-23/2表示在0~23点范围内每2个小时执行一次。 - -","分散的数字(不一定连续),如1,2,3,4,7,9。 - -注:由于各个地方每周第一天不一样,因此Sunday=0(第一天)或Sunday=7(最后1天)。 - -case: 每隔2分钟,删除指定目录下,创建时间超过10个小时的文件 - -*/2 * * * * /bin/sh -c "find /tmp/hadoop-hdfs/mapred/local -cmin +600 -type d -exec rm -rf {} \;" >> /var/lib/hadoop-hdfs/auto_remove_mr_output.out - -二四、Shell编程相关 - -①、内置变量 - -1、declare - -declare声明变量的使用,总结如下: - -declare [+/-][选项] 变量名 - -选项: - -   -:给变量添加类型属性 - -   +:取消变量的类型属性 - -  -a:将变量声明为数组型,-A将声明一个关联数组,俗称字典。  关联知识:Shell 数组与关联数组详解及实例代码(https://www.jb51.net/article/103915.htm) - -  -i:将变量声明为整型 - -  -x:将变量声明为环境变量 - -  -r:将变量声明为只读变量 - -  -p:查看变量的被声明的类型 - -declare -i 说明: - -和 (())、let、$[] 不同,declare -i的功能非常有限,仅支持最基本的数学运算(加减乘除和取余),不支持逻辑运算(比较运算、与运算、或运算、非运算),所以在实际开发中很少使用。 - -declare -i m n ret - -m=10 - -n=30 - -ret=$m+$n - -echo $ret - -ret=$n/$m - -echo $ret - -declare的作用域,只在函数内,出来后就失效了,如下: - -#!/bin/bash - -foo() - -{ - -declare FOO="bar" - -} - -bar() - -{ - -foo - -echo $FOO - -} - -bar - -②、数据结构 - -1、数组 - -Linux shell中数组的使用 - -数组有两种数据类型: - -A). 一是数值类型; - -B). 二是字符串类型. - -虽然shell本身是弱类型的,但也可以这么区分。 - -数值类型的数组:一对括号表示数组,数组中元素之间使用“空格”来隔开。 - -举个列子: - -arr_number=(1 2 3 4 5); - -字符串类型数组:同样,使用一对括号表示数组,其中数组中的元素使用双引号或者单引号包含,同样使用“空格”来隔开。 - -arr_string=("abc" "edf" "sss"); 或者 arr_string=('abc' 'edf' 'sss'); - -#!/bin/bash - -arr_number=(1 2 3 4 5) - -# ①、获取数组长度 - -# 语法: ${#ARRAY_NAME[@|*]} - -echo 'arr_number length ='${#arr_number[@]} - -echo 'arr_number length ='${#arr_number[*]} - -# ②、根据下标访问数组元素(注意:下标与java语法类似,从0开始) - -# 2nd key's value - -echo "2nd key's value ="${arr_number[1]} - -# ③、分片访问 - -echo ${arr_number[@]:0:6} - -# ④、模式替换 - -echo ${arr_number[@]/3/33} - -# ⑤、数组的遍历 - -for e in ${arr_number[@]} - -do - -        echo $e - -done - -# ⑥、综合案例 - -# 编注:数组默认分割符为空格,如果数组元素中本身包含空格,也会被截断,这里通过改变IFS(系统字段分割# 符默认为空格)为换行,达到分割数组的目的。 - -greet=('hello world' "hi,john") - -OLD_IFS=$IFS - -IFS='\n' - -for e in ${greet[@]} - -do - -        echo $e - -done - -IFS=$OLD_IFS - -》①、批量删除日志: - -for i in in {1..10}; do rm -f hadoop-cmf-hive-HIVEMETASTORE-nn1.testhdp.com.log.out.$i;done - -》②、批量将日志置空: - -for i in in {1..10}; do cat /dev/null > hadoop-cmf-yarn-NODEMANAGER-dn8.hadoop.com.log.out.$i;done - -2、字典dict 或 Map - -1). 声明字典类型: - -declare -A dic - -这里一定要-A来声明,-a只能用来声明数组类型。 - -2). 字典赋初值 - -dic=([key1]="value1" [key2]="value2" [key3]="value3") - -3). 字典动态赋值 - -dic['key']=value - -4). 打印指定key的value - -echo ${dic['key']} - -5). 打印所有key值 - -echo ${!dic[*]} - -6). 打印所有value - -echo ${dic[*]} - -7). 遍历key值 - -for key in $(echo ${!dic[*]}) - -do - -    echo "$key : ${dic[$key]}" - -done - -8). 综合案例 - -#! /bin/sh - -#输入格式为一行一个单词 - -declare -A dict - -dict=([k1]="v1" [k2]="v2") - -echo ${dict["k1"]} - -echo ${!dict[*]} - -echo ${dict[*]} - -for key in ${!dict[*]} - -do - -        echo "$key : ${dict[$key]}" - -done - -set -x - -aa="null" - -bb= - -cc='' - -#    -z 字符串为"null".就是长度为0. - -# - -#    -n 字符串不为"null" - -# - -#     注意: - -# - -#     使用-n在[]结构中测试必须要用""把变量引起来.使用一个未被""的字符串来使用! -z - -# - -#     或者就是未用""引用的字符串本身,放到[]结构中。虽然一般情况下可 - -# - -#     以工作,但这是不安全的.习惯于使用""来测试字符串是一种好习惯. - -if [ -n "$cc" ];then - -        echo "aa is not null" - -fi - -set +x - -#定义字典类型变量 - -declare -A dict - -#从标准输入读取 - -while read word - -do - -    #若key为word的变量不存在,则为未定义,即第一次遇到此word,则将此word加入字典并设置其value为1。,否则自增value值 - -    if [ ! -n dict[${word}] ];then - -        dict[${word}]=1 - -    else - -        ((dict[${word}]++)) - -    fi - -done - -#打印统计结果 - -echo -e "word\t\tcount" - -for key in $(echo ${!dict[*]}) - -do - -    echo -e "$key\t\t${dict[$key]}" - -done - -综合案例二: shell的map简单的添加、查找、删除、遍历 - -3、管道输出中执行下一条指令 - -ps -ef | grep 'new-consumer' | awk '{print $2}' |xargs kill -9       #删除kafka consumer进程 - -ps -ef|grep java|grep -v grep|awk '{print $2}'|xargs kill -9          #删除java进程   - -find /opt/flume-custom/ -name *.conf|xargs grep -re "127.0.0.1:9092" #查找到的文件中查找指定字符串 - -find /opt/ -type f -name '*.log' |xargs grep 'db.hostname' - -cat ~/.ssh/id_rsa.pub | ssh my_admin@111.111.111.111 "cat - >> ~/.ssh/authorized_keys" - -kill -9 $(ps -ef|grep "sh\ *start_new.sh\ *main"|grep -v grep|awk '{print $2}') #\ *表任意多空格 - -kill -9 `ps -ef|grep data-integration|awk '{print $2}'` - -ls|while read f;do zip -r ${f}.zip $f;done  #压缩所有ls出来的文件夹 - -ls|grep 'hadoop-cmf-yarn-RESOURCEMANAGER-nn1.hadoop.com.log.out.[0-9]\{1,\}'|while read f;do cat /dev/null > $f;done #将所有RESOURCEMANAGER日志文件内容置为空,文件尾缀为1个以上从0到9的数字,如1、2、9、12均能匹配查找到,在nn1上磁盘(/var/log/{hadoop-hdfs,hadoop-yarn})上日志一般都比较大 - -# 查找10日前创建的文件,并情况其内容 - -find . -type f -name '*oozie-instrumentation.log.*' -atime +10 | while read f;do cat /dev/null > $f;done - -#查看所有用户的crontab任务,其中"-I {}"参数,可以使用-i来等量实现 - -cat /etc/passwd | cut -f 1 -d : |xargs -I {} crontab -l -u {} - -cat /etc/passwd | cut -f 1 -d : |xargs -i crontab -l -u {} - -# 查询当前目录下所有文件(含目录下文件)中包含关键字(sku)的文件路径, 滤重, 并过滤掉路径中含指定字符(000) - -grep -rn 'sku' * | awk -F ':' '{print $1}' | uniq | grep -v 000 - -传送门:Shell基础知识》xargs详解 - -读取文件每一行,并循环做处理: - -①、while read line - -do - -       … - -done < file - -②、cat file  | ${BIZ_LOGICAL} - -综合实例: - -ssh   127.0.0.1 <$line; done - -ls lib/* |while read line;do jar -tf $line|grep LogAnalysis; echo $line;done - -#hdfs文件大小统计排序 - -hdfs dfs -du ${HDFS_PATH} | sort -rn | head -n 10 | awk '{printf("%.2f\t\t%.2f\t\t%s\t\n",$1/1024/1024/1024,"\t"$2/1024/1024/1024,"\t"$3)}' - -#获取所有java程序的进程号 - -ps -ef | while read line ; do if [[ $line =~ "java" ]] ;then echo $line |  awk -F ' ' '{print $2}' ; fi ;done - -//循环所有文件,并添加header - -#!/bin/bash - -ls OrderDetail_sysdate_* |while read file;do - -sed -i "1i\\$(cat header.csv)" $file - -done - -综合案例: - -清理日志文件夹中的日志文件,将其置为黑洞文件内容(即情况该文件)。 - -#!/bin/bash - -#先遍历本文件夹里文件夹 - -dir_list=`ls` - -#对查询到的文件夹执行清空其内文件的操作 - -for dir in $dir_list;do - -    echo $dir - -    ls $dir/* | while read line;do echo $line; cat /dev/null > $line; done - -done - -for i in `seq 1 $(cat /proc/cpuinfo |grep "physical id" |wc -l)`; do dd if=/dev/zero of=/dev/null & done - -pkill -9 dd - -5、break 与 contine区别 - -如下代码所示: - -不带参数 N:    - -break     循环只能退出最内层的循环; - -continue     只能去掉本次循环的剩余代码; - -带参数 N:    - -break N    可以退出N层循环; - -continue N     将会把N层循环剩余代码都去掉,单循环次数不变; - -#!/bin/bash - -for i in a b c d - -do - -    echo -n $i - -    for j in `seq 10` - -    do - -        if test $j -eq 5;then - -            #break - -           # continue - -            #break 2 - -            continue 2 - -        fi - -        echo -n $j - -    done - -    #换行 - -    echo - -done - -########################################## - -### - -### Program result: - -### - -########################################## - -# - -#>>>>>>>>>>>>>> 1. break >>>>>>>>>>>>>>>>> - -# a1234 - -# b1234 - -# c1234 - -# d1234 - -#>>>>>>>>>>>>>> 2. continue >>>>>>>>>>>>>>>>> - -# a1234678910 - -# b1234678910 - -# c1234678910 - -# d1234678910 - -#>>>>>>>>>>>>>> 3. "break 2","break 3" has same effect >>>>>>>>>>>>>>>>> - -# a1234 - -#>>>>>>>>>>>>>> 4. "continue 2" >>>>>>>>>>>>>>>>> - -# a1234 - -# b1234 - -# c1234 - -# d1234 - -6、大文件拆分处理 - -文件拆分: - -split -d -a 8 -l 10000 PayOrderDetail.csv PayOrderDetail_sysdate_.csv - -用法: - -Usage: split [OPTION]... [INPUT [PREFIX]] - -Output fixed-size pieces of INPUT to PREFIXaa, PREFIXab, ...; default - -size is 1000 lines, and default PREFIX is 'x'.  With no INPUT, or when INPUT - -is -, read standard input. - -Mandatory arguments to long options are mandatory for short options too. - -  -a, --suffix-length=N   generate suffixes of length N (default 2) - -      --additional-suffix=SUFFIX  append an additional SUFFIX to file names - -  -b, --bytes=SIZE        put SIZE bytes per output file - -  -C, --line-bytes=SIZE   put at most SIZE bytes of lines per output file - -  -d, --numeric-suffixes[=FROM]  use numeric suffixes instead of alphabetic; - -                                   FROM changes the start value (default 0) - -  -e, --elide-empty-files  do not generate empty output files with '-n' - -      --filter=COMMAND    write to shell COMMAND; file name is $FILE - -  -l, --lines=NUMBER      put NUMBER lines per output file - -  -n, --number=CHUNKS     generate CHUNKS output files; see explanation below - -  -u, --unbuffered        immediately copy input to output with '-n r/...' - -      --verbose           print a diagnostic just before each - -                            output file is opened - -      --help     display this help and exit - -      --version  output version information and exit - -SIZE is an integer and optional unit (example: 10M is 10*1024*1024).  Units - -are K, M, G, T, P, E, Z, Y (powers of 1024) or KB, MB, ... (powers of 1000). - -CHUNKS may be: - -N       split into N files based on size of input - -K/N     output Kth of N to stdout - -l/N     split into N files without splitting lines - -l/K/N   output Kth of N to stdout without splitting lines - -r/N     like 'l' but use round robin distribution - -r/K/N   likewise but only output Kth of N to stdout - -GNU coreutils online help: <[http://www.gnu.org/software/coreutils/](http://www.gnu.org/software/coreutils/)> - -For complete documentation, run: info coreutils 'split invocation' - -详细案例,详见:split命令_Linux split命令:切割(拆分)文件 - -7、awk - -#批量删除hdfs下ods层下所有数据 - -hdfs dfs -lsr /user/hive/warehouse/ods|awk '{print "hdfs dfs -rm -R" $8}' - -8、实现脚本中切换用户并执行该用户相关的命令操作 - -假如当前用户为root账户,希望切换到其他用户下执行相关的操作,如有以下业务场景: - -想以yarn用户身份,取删除yarn运行相关的早期用处不大的日志。 - -方式①、 - -#!/bin/bash - -su - yarn < /dev/null 2>&1 & - -注意: - -该命令的执行权限是临时的,只在本条语句起作用。即在COMMAND命令行内部,是以$USER身份执行命令;执行结束后,回到初始状态用户,这里为root。 - -案例: - -## 01-Handle logic of clean HDFS NAMENODE & DATANODE & audit logs. - -######################################################## - -su - hdfs -c ' - -        HDFS_PATH=/var/log/hadoop-hdfs; - -        ls $HDFS_PATH | grep "hadoop-cmf-hdfs-NAMENODE-nn1.hadoop.com.log.out.[0-9]\{1,\}$" | while read f;     do `cat /dev/null > $HDFS_PATH/$f`; done   ; - -        ls $HDFS_PATH | grep "hadoop-cmf-hdfs-DATANODE-nn1.hadoop.com.log.out.[0-9]\{1,\}$" | while read f;     do `cat /dev/null > $HDFS_PATH/$f`; done   ; - -        ls $HDFS_PATH | grep "hdfs-audit.log.[0-9]\{1,\}$" | while read f;                                      do `cat /dev/null > $HDFS_PATH/$f`; done - -' - -注意: - -① ls这段语句在命令行下执行没任何问题,提取到“su - hdfs -c”中时,`cat /dev/null > $HDFS_PATH/$f`这段必须要包裹上``符号,才能正常执行。 - -② -c 参数中,可以执行多行命令,但是需要几个条件:A). 所用命令使用''包裹,每一行命令间,使用";"来进行分隔。 - -补充su的用法: - -[root@cdh-nn1 ~]# su --help - -Usage: - - su [options] [-] [USER [arg]...] - -Change the effective user id and group id to that of USER. - -A mere - implies -l.   If USER not given, assume root. - -Options: - - -m, -p, --preserve-environment  do not reset environment variables - - -g, --group              specify the primary group - - -G, --supp-group         specify a supplemental group - - -, -l, --login                  make the shell a login shell - - -c, --command          pass a single command to the shell with -c - - --session-command      pass a single command to the shell with -c - -                                 and do not create a new session - - -f, --fast                      pass -f to the shell (for csh or tcsh) - - -s, --shell              run shell if /etc/shells allows it - - -h, --help     display this help and exit - - -V, --version  output version information and exit - -For more details see su(1). - -su 和 “su - ${USER}”的区别: - -①、su只是切换用户。 - -②、su - 切换用户并切换shell环境。 - -③、su another - -pwd后为/home/current - -④、su - another - -pwd后为/home/another - -9、awk实现查找奇数行、偶数行: - -seq 20 > test.txt - -[root@server1 tmp]# awk 'NR%2 != 0' test.txt - -[root@server1 tmp]# awk 'NR%2 == 0' test.txt - -10、IFS专题 - -IFS, 全称 内部字段分隔符(Internal Field Separator, IFS) , 作用是在Linux中定义一个定界符,默认是空格。 - -如果字符串中的分隔符,默认不是空格,而是逗号(如csv文件), 则可以考虑临时替换IFS为逗号,处理完文本处理任务后, 再将默认的修改回来. - -如果脚本实现, 按","提取表名list: - -batch_upsert_table_process.sh - -#!/bin/bash - -include_tables="activity_info,activity_rule,activity_sku,base_category1,base_category2,base_category3,base_province,base_region,base_trademark,coupon_info,coupon_range,coupon_use,financial_sku_cost,sku_info,spu_info,user_info" - -function get_element_by_split_comma(){ - -    ifs_old=$IFS - -    IFS="," - -    for tbl in $(echo "${include_tables}");do - -        echo 'Now is handle table >>>>>>>>>>>>>>>>>>>>> '$tbl - -        /data/maxwell/bin/maxwell-bootstrap --database gmall --table $tbl --config /data/maxwell/tf_custom_config/gmall_rtdw_test.properties - -    done - -    #Recovery IFS to default - -    IFS=$ifs_old - -} - -get_element_by_split_comma - -③、echo在shell中控制颜色&闪烁显示 - -1、在shell中显示色彩 - -语法格式: - -echo -e "\033[颜色1:颜色2m 要展示的文字 \033[0m" - -参数说明: - ------------------------------------------------------------------------------------------------------------------------ - --e选项:表示允许反斜杠(对字符)转义。 - -\033[颜色1;颜色2m:称为转义序列,它本身是一个整体,中间不要有空格。 - -\033[:转义序列的开始。其中\033代表Esc符号,也可以使用\E或\e来代替。 - -颜色1和颜色2:表示字体的前景色或背景色,至于颜色1和颜色2哪一个表示前景色,哪一个表示背景色,由其设定的数值来决定,前景色和背景色的数值空间是不同的。 - -m:转义序列的终止标志。 - -\033[0m:表示将颜色恢复回原来的配色。 - - 我们可以用一张原理图来理解: - ------------------------------------------------------------------------------------------------------------------------ - -图示说明: - -颜色码: - -④、数据类型转化 - -1、字符串转化为数字 - -案例1: 将日期中以0开头的数字字符串转换为数字 - -比如今日为2022-03-25, 如果想获取月份, 可以使用 echo $(date +%m) 或 echo `date +%m`, 将获取到字符串"03", 但我们想要去掉开头0的3, 翻遍date的api都没有找到. - -这时候可以考虑使用数学运算将原字符串 与 一个数字0相加, 变相通过数学计算获取到整形的计算结果. - -[hdfs@hadoop test]$ echo $(expr $(date +%m) + 0) - -3 - -[hdfs@hadoop test]$ echo `expr $(date +%m) + 0` - -3 - -[hdfs@hadoop test]$ hive --hivevar year=$(date +%Y) --hivevar month=`expr $(date +%m) + 0` -f /data/program/test_hive.hql - -test_hive.hql中则可以使用上述动态传参的值: - -ALTER TABLE ads.my_partition_table_test DROP IF EXISTS PARTITION(year=${hivevar:year}, month=${hivevar:month}); - -⑤、登录shell 与 非登录shell区别 - -登录shell:使用linux账户登录后执行的shell - -非登录shell:不经登录,直接使用shell,如ssh 远程连接到主机后执行的shell - -注意: - - 如果将环境变量配置信息,配置在/etc/profile中,对于非登录shell,则获取不到。 - -而对于/etc/profile.d/*.sh,则对于2种shell,都可以访问到。 - -二十五、程序开机自启动服务配置 - -Centos系统服务器脚本目录位置:/usr/lib/systemd/ - -其内部有系统(system)和用户(user)2个文件夹,如需要开机不登录即要求能执行的程序,在系统服务(system)里,即/usr/lib/systemd/system; - -而如果需要用户登录之后才可以运行的程序,在用户服务(user)里,即/usr/lib/systemd/user。 - -这里以nginx服务开启自启为例: - -[Unit]    - -Description=Nginx restart on Reboot - -After=network.target    - -[Service]    - -Type=forking    - -User=nginx - -Group=nginx - -ExecStart=/etc/init.d/nginx start    - -ExecReload=/etc/init.d/nginx restart    - -ExecStop=/etc/init.d/nginx  stop    - -PrivateTmp=true    - -[Install]    - -WantedBy=multi-user.target   - -参数说明: - -Description:描述服务 - -After:描述本服务的上游依赖关系,即上游启动完毕后,才可以启动本服务 - -[Service]服务运行参数的设置 - -Type=forking是后台运行的形式 - -User服务启动用户 - -Group服务启动用户组 - -ExecStart为服务的具体运行命令 - -ExecReload为重启命令 - -ExecStop为停止命令 - -PrivateTmp=True表示给服务分配独立的临时空间 - -注意: - -[Service]的启动、重启、停止命令全部要求使用绝对路径 - -[Install]服务安装的相关设置,可设置为多用户 - -一般文件以644权限进行保存,如下: - -[root@nn2 system]# ll frp.service - --rw-r--r-- 1 root root 266 Oct 29 11:50 frp.service - -设置开机自启动命令:systemctl  enable  nginx.service - ->> 如果查看systemctl启动服务的log信息? - -Service启动之后, 如果想查询其详细日志信息, 可以使用类似tail的命令, 使用journalctl -f 可以来实时追踪日志. - -使用journalctl可以查看使用systemctl启动的service,常用参数有两种, 如下: - -①. 显示多个混合在一起的systemctl 服务日志, 一般刚启动完一个service时查看比较方便 - -journalctl -f - -②. 只查看某一个具体的service服务的日志 - -journalctl -u 服务名 - -如: - -2021-11-10 10:06:37 nn1 systemd: Started Bigdata KafkaManager. - -2021-11-10 10:06:37 nn1 kafka-manager: This application is already running (Or delete /opt/software/kafka-manager-1.3.3.23/RUNNING_PID file). - -2021-11-10 10:06:37 nn1 systemd: bigdata_kafkaManager.service: main process exited, code=exited, status=255/n/a - -2021-11-10 10:06:37 nn1 systemd: Unit bigdata_kafkaManager.service entered failed state. - -2021-11-10 10:06:37 nn1 systemd: bigdata_kafkaManager.service failed. - -2021-11-10 10:06:46 nn1 bigdata_admin: root [/etc/systemd/system]2021-11-10 10:06:46 systemctl is-enabled bigdata_kafkaManager.service - -2021-11-10 10:06:52 nn1 systemd: Reloading. - -2021-11-10 10:06:53 nn1 systemd: [/run/systemd/generator.late/cloudera-scm-server.service:13] Failed to add dependency on +cloudera-scm-server-db.service, ignoring: Invalid argument - -2021-11-10 10:06:53 nn1 systemd: [/etc/systemd/system/bigdata_kafkaManager.service:15] Unknown lvalue 'StartLimitIntervalSec' in section 'Service' - -2021-11-10 10:06:53 nn1 bigdata_admin: root [/etc/systemd/system]2021-11-10 10:06:52 systemctl disable bigdata_kafkaManager.service - -2021-11-10 10:07:02 nn1 systemd: Stopped Bigdata KafkaManager. - -2021-11-10 10:07:02 nn1 systemd: [/etc/systemd/system/bigdata_kafkaManager.service:15] Unknown lvalue 'StartLimitIntervalSec' in section 'Service' - -2021-11-10 10:07:02 nn1 systemd: [/etc/systemd/system/bigdata_kafkaManager.service:15] Unknown lvalue 'StartLimitIntervalSec' in section 'Service' - -2021-11-10 10:07:02 nn1 bigdata_admin: root [/etc/systemd/system]2021-11-10 10:07:02 systemctl stop bigdata_kafkaManager.service - -③. 通过 "系统日志" 来进行查询 - -tail -100f /var/log/message - -2021-11-10 10:06:37 nn1 systemd: Started Bigdata KafkaManager. - -2021-11-10 10:06:37 nn1 kafka-manager: This application is already running (Or delete /opt/software/kafka-manager-1.3.3.23/RUNNING_PID file). - -2021-11-10 10:06:37 nn1 systemd: bigdata_kafkaManager.service: main process exited, code=exited, status=255/n/a - -2021-11-10 10:06:37 nn1 systemd: Unit bigdata_kafkaManager.service entered failed state. - -2021-11-10 10:06:37 nn1 systemd: bigdata_kafkaManager.service failed. - -2021-11-10 10:06:46 nn1 bigdata_admin: root [/etc/systemd/system]2021-11-10 10:06:46 systemctl is-enabled bigdata_kafkaManager.service - -2021-11-10 10:06:52 nn1 systemd: Reloading. - -2021-11-10 10:06:53 nn1 systemd: [/run/systemd/generator.late/cloudera-scm-server.service:13] Failed to add dependency on +cloudera-scm-server-db.service, ignoring: Invalid argument - -2021-11-10 10:06:53 nn1 systemd: [/etc/systemd/system/bigdata_kafkaManager.service:15] Unknown lvalue 'StartLimitIntervalSec' in section 'Service' - -2021-11-10 10:06:53 nn1 bigdata_admin: root [/etc/systemd/system]2021-11-10 10:06:52 systemctl disable bigdata_kafkaManager.service - -2021-11-10 10:07:02 nn1 systemd: Stopped Bigdata KafkaManager. - -2021-11-10 10:07:02 nn1 systemd: [/etc/systemd/system/bigdata_kafkaManager.service:15] Unknown lvalue 'StartLimitIntervalSec' in section 'Service' - -2021-11-10 10:07:02 nn1 systemd: [/etc/systemd/system/bigdata_kafkaManager.service:15] Unknown lvalue 'StartLimitIntervalSec' in section 'Service' - -2021-11-10 10:07:02 nn1 bigdata_admin: root [/etc/systemd/system]2021-11-10 10:07:02 systemctl stop bigdata_kafkaManager.service - -2021-11-10 10:07:24 nn1 bigdata_admin: root [/etc/systemd/system]2021-11-10 10:07:08 watch free -g - -2021-11-10 10:07:24 nn1 bigdata_admin: root [/etc/systemd/system]2021-11-10 10:07:08 watch free -g - -2021-11-10 10:07:24 nn1 bigdata_admin: root [/etc/systemd/system]2021-11-10 10:07:08 watch free -g - -2021-11-10 10:18:20 nn1 bigdata_admin: root [/etc/systemd/system]2021-11-10 10:08:19 tail -100f /var/log/messages - -二十六、持续监控Linux命令的执行情况 - -watch -d -n 1 ls -l - -参数说明: - -①、-n:默认为2s刷新一次,通过-n 参数更新刷新频次; - -②、-d:方便查看输出与上次的不同之处。 \ No newline at end of file diff --git a/docs/cursor/cursor.md b/docs/cursor/cursor.md index 68881ee..42f7ac6 100644 --- a/docs/cursor/cursor.md +++ b/docs/cursor/cursor.md @@ -13,66 +13,3 @@ pkill -f "cursor-server" -联通大王卡号:13022988679 -公司电信卡号:17392826953 QQ号:3145431252 密码:renjianbo0118 邮箱:3145431252@qq.com 密码:renjianbo0118 网易邮箱17392826953@163.com !renjianbo1219 -公司移动卡号:15129026818 - - -瑞来康健微信小程序账号:15129026818@163.com 密码:Ruilaizi123456 -公众号账号:17392826953@163.com 密码:Ruilaizi123456 - - -瑞来兹开票信息 -公司名称:西安瑞来兹软件科技有限公司 -统一社会信息代码:91610131MAB0GH1Y54 -地址:陕西省西安市高新区科技二路65号启迪科技园D座9楼10901号 -电话:18691577328 -开户行及帐号:中国农业银行股份有限公司西安丈八四路分理处 -26121201040005017 - - - -公司手机号:15129026818 -公司QQ号:2183824293 renjianbo0206 绑定的的手机18133922183 -微信小程序官网:https://mp.weixin.qq.com/ -小程序2183824293@qq.com renjianbo0118 -名片秘钥 -887cd30d79bba800b30d8c4ef919a20c -公司服务器密码:~Ruilaizi123456 - -接口文档账号:903292507@qq.com renjianbo0118 - -项目管理系统 -https://pingcode.com/?utm_source=%E5%93%81%E7%89%8C%E4%B8%93%E5%8C%BA&utm_medium=pc-pingcode&utm_campaign=%E5%93%81%E7%89%8C%E4%B8%93%E5%8C%BA-%E9%AB%98%E7%BA%A7%E7%89%88&utm_content=PC-%E6%90%9C%E7%B4%A2%E9%80%9A%E6%A0%8F%E5%95%86%E5%93%81tab%E6%A0%B7%E5%BC%8F&utm_term=%E6%A0%87%E9%A2%98-PingCode&e_matchtype={matchtype}&e_creative={creative}&e_adposition={adposition}&e_pagenum={pagenum}&e_keywordid={keywordid} - -管理 17392826953 - 3145431252@qq.com renjianbo0118 - 18302920526 ruilaizi - 18792702169 ruilaizi - - -google账号:renj62507@gmail.com renjianbo123 - - -99API 账户:18133922183 renjianbo1219 -chatAI 18133922183@163.com !renjianbo0118 - - -儿童医院小程序注册邮箱 3669785689@qq.com !ruilaizi123456 - -微信开放平台 生长激素预测模型小程序 3990202197@qq.com renjianbo1219 -生长激素预测模型小程序3858752441@qq.com renjianbo1219 -飞书账号:15129026818 -github账号密码:263303411@qq.com renjianbo0118 - -硅基密钥:sk-xpptixobqxshkmikjvjeoltekytqmmresfndhoivezomuobn -deepssk:sk-fdf7cc1c73504e628ec0119b7e11b8cc -263303411 renjianbo1219 - -计算云 renjianbo 密码!Rjb1219 - - -荣耀开放平台 手机号 15129026818 邮箱263303411@qq.com renjianbo1219 - - -curse 网站续费 https://cursor.com/cn/dashboard diff --git a/docs/cursor/cursor使用技巧.md b/docs/cursor/cursor使用技巧.md new file mode 100644 index 0000000..66dbddf --- /dev/null +++ b/docs/cursor/cursor使用技巧.md @@ -0,0 +1,836 @@ +# Cursor 使用技巧指南 + +## 目录 +- [基础操作技巧](#基础操作技巧) +- [AI 功能使用](#ai-功能使用) +- [快捷键大全](#快捷键大全) +- [代码编辑技巧](#代码编辑技巧) +- [搜索与导航](#搜索与导航) +- [调试技巧](#调试技巧) +- [多文件编辑](#多文件编辑) +- [代码重构](#代码重构) +- [Git 集成](#git-集成) +- [插件与扩展](#插件与扩展) +- [性能优化](#性能优化) +- [常见问题解决](#常见问题解决) +- [高级技巧](#高级技巧) + +--- + +## 基础操作技巧 + +### 快速打开文件 +```bash +# 使用命令面板 +Ctrl + Shift + P (Windows/Linux) +Cmd + Shift + P (Mac) + +# 快速打开文件 +Ctrl + P (Windows/Linux) +Cmd + P (Mac) + +# 快速打开符号(函数、类等) +Ctrl + Shift + O (Windows/Linux) +Cmd + Shift + O (Mac) +``` + +### 多光标编辑 +```bash +# 添加多个光标 +Alt + Click # 在多个位置添加光标 +Ctrl + Alt + ↑/↓ # 在上/下行添加光标 +Ctrl + D # 选择下一个相同的词 +Ctrl + Shift + L # 选择所有相同的词 +``` + +### 代码折叠 +```bash +# 折叠/展开代码块 +Ctrl + Shift + [ # 折叠当前代码块 +Ctrl + Shift + ] # 展开当前代码块 +Ctrl + K Ctrl + 0 # 折叠所有代码块 +Ctrl + K Ctrl + J # 展开所有代码块 +``` + +### 快速跳转 +```bash +# 跳转到定义 +F12 # 跳转到定义 +Ctrl + Click # 按住Ctrl点击跳转 +Alt + F12 # 预览定义(不跳转) + +# 跳转到引用 +Shift + F12 # 查找所有引用 + +# 返回上一位置 +Ctrl + - # 返回上一位置 +Ctrl + Shift + - # 前进到下一位置 +``` + +--- + +## AI 功能使用 + +### Chat 功能 +```bash +# 打开 Chat 面板 +Ctrl + L (Windows/Linux) +Cmd + L (Mac) + +# 或者使用命令面板 +Ctrl + Shift + P -> "Cursor: Open Chat" +``` + +**使用技巧:** +- 选中代码后,在 Chat 中会自动包含上下文 +- 使用 `@文件名` 引用特定文件 +- 使用 `@代码库` 引用整个代码库 +- 使用 `@文档` 引用文档 + +### Composer 功能 +```bash +# 打开 Composer +Ctrl + I (Windows/Linux) +Cmd + I (Mac) +``` + +**使用场景:** +- 多文件编辑 +- 大型重构任务 +- 跨文件代码生成 +- 复杂功能实现 + +### 内联编辑(Tab 补全) +```bash +# 自动触发 +# 输入代码时,Cursor 会自动提供建议 +Tab # 接受建议 +Ctrl + → # 接受部分建议 +Esc # 拒绝建议 +``` + +### 代码生成提示 +```bash +# 使用注释触发 +// TODO: 实现用户登录功能 +// FIXME: 修复内存泄漏问题 +// CURSOR: 生成一个用户注册表单 +``` + +### AI 命令使用 +```bash +# 在 Chat 中使用特殊命令 +/explain # 解释代码 +/refactor # 重构代码 +/fix # 修复错误 +/test # 生成测试 +/document # 生成文档 +``` + +--- + +## 快捷键大全 + +### 文件操作 +| 功能 | Windows/Linux | Mac | +|------|--------------|-----| +| 新建文件 | Ctrl + N | Cmd + N | +| 打开文件 | Ctrl + O | Cmd + O | +| 保存文件 | Ctrl + S | Cmd + S | +| 保存所有 | Ctrl + K S | Cmd + K S | +| 关闭文件 | Ctrl + W | Cmd + W | +| 关闭所有 | Ctrl + K W | Cmd + K W | +| 重新打开文件 | Ctrl + Shift + T | Cmd + Shift + T | + +### 编辑操作 +| 功能 | Windows/Linux | Mac | +|------|--------------|-----| +| 撤销 | Ctrl + Z | Cmd + Z | +| 重做 | Ctrl + Y | Cmd + Shift + Z | +| 复制行 | Shift + Alt + ↓ | Shift + Option + ↓ | +| 删除行 | Ctrl + Shift + K | Cmd + Shift + K | +| 移动行 | Alt + ↑/↓ | Option + ↑/↓ | +| 注释行 | Ctrl + / | Cmd + / | +| 格式化 | Shift + Alt + F | Shift + Option + F | +| 全选 | Ctrl + A | Cmd + A | + +### 导航操作 +| 功能 | Windows/Linux | Mac | +|------|--------------|-----| +| 跳转到行 | Ctrl + G | Cmd + G | +| 跳转到符号 | Ctrl + Shift + O | Cmd + Shift + O | +| 跳转到定义 | F12 | F12 | +| 查找引用 | Shift + F12 | Shift + F12 | +| 返回上一位置 | Ctrl + - | Cmd + - | +| 前进到下一位置 | Ctrl + Shift + - | Cmd + Shift + - | + +### 搜索操作 +| 功能 | Windows/Linux | Mac | +|------|--------------|-----| +| 查找 | Ctrl + F | Cmd + F | +| 替换 | Ctrl + H | Cmd + Option + F | +| 全项目查找 | Ctrl + Shift + F | Cmd + Shift + F | +| 全项目替换 | Ctrl + Shift + H | Cmd + Shift + H | + +### AI 相关快捷键 +| 功能 | Windows/Linux | Mac | +|------|--------------|-----| +| 打开 Chat | Ctrl + L | Cmd + L | +| 打开 Composer | Ctrl + I | Cmd + I | +| 接受建议 | Tab | Tab | +| 拒绝建议 | Esc | Esc | +| 接受部分建议 | Ctrl + → | Cmd + → | + +--- + +## 代码编辑技巧 + +### 多光标编辑 +```javascript +// 示例:同时编辑多个变量 +// 1. 选中第一个变量名 +// 2. 按 Ctrl + D 选择下一个相同的词 +// 3. 继续按 Ctrl + D 选择更多 +// 4. 开始编辑,所有选中的位置会同步修改 + +const userName = "John"; +const userEmail = "john@example.com"; +const userAge = 30; +// 选中所有 "user" 后,可以统一重命名 +``` + +### 列选择模式 +```bash +# 进入列选择模式 +Shift + Alt + 鼠标拖动 # Windows/Linux +Shift + Option + 鼠标拖动 # Mac + +# 或者使用键盘 +Ctrl + Shift + Alt + ↑/↓ # Windows/Linux +Cmd + Shift + Option + ↑/↓ # Mac +``` + +### 代码块选择 +```bash +# 扩展选择 +Ctrl + Shift + → # 扩展选择到词 +Ctrl + Shift + Alt + → # 扩展选择到代码块 +``` + +### 快速复制/移动 +```bash +# 复制当前行 +Shift + Alt + ↓ # 向下复制 +Shift + Alt + ↑ # 向上复制 + +# 移动当前行 +Alt + ↓ # 向下移动 +Alt + ↑ # 向上移动 +``` + +### 智能重命名 +```bash +# 重命名符号 +F2 # 重命名当前符号 +# 会自动更新所有引用 +``` + +--- + +## 搜索与导航 + +### 快速文件搜索 +```bash +# 按文件名搜索 +Ctrl + P # 打开快速文件搜索 +# 输入文件名或路径的一部分即可 + +# 按符号搜索 +Ctrl + Shift + O # 在当前文件中搜索符号 +Ctrl + T # 在整个项目中搜索符号 +``` + +### 高级搜索 +```bash +# 全项目搜索 +Ctrl + Shift + F # 打开搜索面板 + +# 搜索选项 +# - 区分大小写 +# - 全词匹配 +# - 正则表达式 +# - 包含/排除文件 +``` + +### 使用正则表达式搜索 +```bash +# 在搜索框中启用正则表达式 +# 示例: +# 查找所有 console.log +console\.log + +# 查找所有函数定义 +function\s+\w+ + +# 查找所有 TODO 注释 +TODO|FIXME|XXX +``` + +### 文件导航 +```bash +# 在文件之间快速切换 +Ctrl + Tab # 切换最近打开的文件 +Ctrl + P # 快速打开文件 + +# 在编辑器中导航 +Ctrl + G # 跳转到指定行号 +Ctrl + Shift + O # 跳转到文件中的符号 +``` + +--- + +## 调试技巧 + +### 断点设置 +```bash +# 设置断点 +F9 # 切换断点 +Ctrl + Shift + F9 # 删除所有断点 + +# 条件断点 +# 右键点击断点 -> 编辑断点 -> 添加条件 +``` + +### 调试控制 +```bash +F5 # 开始调试 +F10 # 单步跳过 +F11 # 单步进入 +Shift + F11 # 单步跳出 +Ctrl + Shift + F5 # 重启调试 +Shift + F5 # 停止调试 +``` + +### 调试面板 +```bash +Ctrl + Shift + D # 打开调试面板 +# 可以查看变量、调用栈、断点等 +``` + +### 日志调试 +```bash +# 使用 console.log +console.log('Debug:', variable); + +# 使用断点 +debugger; # 在代码中插入断点 +``` + +--- + +## 多文件编辑 + +### 分割编辑器 +```bash +# 水平分割 +Ctrl + \ # 分割编辑器 +Ctrl + 1/2/3 # 切换到不同编辑器组 + +# 垂直分割 +Ctrl + K Ctrl + \ # 垂直分割 + +# 关闭编辑器组 +Ctrl + K W # 关闭当前编辑器组 +``` + +### 并排编辑 +```bash +# 打开文件到侧边 +Ctrl + K → # 打开文件到右侧 +Ctrl + K ← # 打开文件到左侧 + +# 移动文件到不同组 +Ctrl + K Ctrl + ←/→ # 移动文件到左/右组 +``` + +### 文件对比 +```bash +# 对比两个文件 +# 1. 右键点击文件 -> "Select for Compare" +# 2. 右键点击另一个文件 -> "Compare with Selected" +``` + +--- + +## 代码重构 + +### 提取函数 +```bash +# 选中代码块 +# 右键 -> "Extract Function" +# 或使用快捷键 +Ctrl + Shift + R # 快速重构菜单 +``` + +### 重命名符号 +```bash +F2 # 重命名符号 +# 会自动更新所有引用 +``` + +### 提取变量 +```bash +# 选中表达式 +# 右键 -> "Extract Variable" +# 或使用命令面板 +Ctrl + Shift + P -> "Extract Variable" +``` + +### 内联变量/函数 +```bash +# 选中变量或函数调用 +# 右键 -> "Inline Variable" 或 "Inline Function" +``` + +### 移动代码 +```bash +# 选中代码 +Alt + ↑/↓ # 移动代码块 +``` + +--- + +## Git 集成 + +### Git 操作 +```bash +# 打开源代码管理 +Ctrl + Shift + G # 打开 Git 面板 + +# 常用操作 +# - 查看更改 +# - 暂存文件 +# - 提交更改 +# - 推送/拉取 +``` + +### 查看 Git 历史 +```bash +# 查看文件历史 +# 右键文件 -> "Open Timeline" +# 或使用命令 +Ctrl + Shift + P -> "Git: View File History" +``` + +### 分支管理 +```bash +# 切换分支 +Ctrl + Shift + P -> "Git: Checkout to..." +# 创建分支 +Ctrl + Shift + P -> "Git: Create Branch..." +``` + +### 解决冲突 +```bash +# 合并冲突时 +# Cursor 会高亮冲突区域 +# 使用 "Accept Current Change" / "Accept Incoming Change" 等选项 +``` + +--- + +## 插件与扩展 + +### 推荐插件 +```bash +# 代码格式化 +- Prettier +- ESLint +- Black (Python) + +# 主题 +- One Dark Pro +- Material Theme +- Dracula Official + +# 实用工具 +- GitLens +- Error Lens +- Bracket Pair Colorizer +- Path Intellisense +- Auto Rename Tag +``` + +### 安装插件 +```bash +# 打开扩展面板 +Ctrl + Shift + X # 打开扩展面板 +# 搜索并安装插件 +``` + +### 插件配置 +```bash +# 打开设置 +Ctrl + , # 打开设置 +# 搜索插件名称进行配置 +``` + +--- + +## 性能优化 + +### 禁用不必要的功能 +```bash +# 在设置中禁用 +# - 文件监听(如果项目很大) +# - 某些语言服务器 +# - 不必要的扩展 +``` + +### 排除文件/文件夹 +```bash +# 在 .cursorignore 或 .gitignore 中 +node_modules/ +dist/ +build/ +*.log +``` + +### 限制 AI 上下文 +```bash +# 在设置中调整 +# - AI 上下文窗口大小 +# - 自动补全延迟 +# - 最大文件大小 +``` + +### 清理缓存 +```bash +# 清理 Cursor 缓存 +# Windows +%APPDATA%\Cursor\Cache + +# Mac +~/Library/Application Support/Cursor/Cache + +# Linux +~/.config/Cursor/Cache +``` + +### 重启 Cursor Server +```bash +# 如果 Cursor 变慢,可以重启服务 +# Linux/Mac +pkill -f "cursor-server" + +# 或者使用命令面板 +Ctrl + Shift + P -> "Developer: Reload Window" +``` + +--- + +## 常见问题解决 + +### Cursor 无响应 +```bash +# 1. 重启 Cursor +# 2. 清理缓存 +# 3. 检查系统资源 +# 4. 禁用不必要的扩展 +``` + +### AI 功能不工作 +```bash +# 1. 检查网络连接 +# 2. 检查 API 密钥设置 +# 3. 查看 Cursor 状态栏的错误信息 +# 4. 重启 Cursor +``` + +### 代码补全不显示 +```bash +# 1. 检查语言服务器是否运行 +# 2. 检查文件类型是否正确识别 +# 3. 重启语言服务器 +Ctrl + Shift + P -> "Developer: Restart Extension Host" +``` + +### 快捷键冲突 +```bash +# 1. 检查系统快捷键设置 +# 2. 在 Cursor 设置中自定义快捷键 +Ctrl + K Ctrl + S # 打开快捷键设置 +``` + +### 文件无法保存 +```bash +# 1. 检查文件权限 +# 2. 检查磁盘空间 +# 3. 检查文件是否被其他程序占用 +``` + +### 中文输入问题 +```bash +# 1. 检查输入法设置 +# 2. 在设置中启用 "Editor: Accept Suggestion On Commit Character" +# 3. 调整输入法快捷键 +``` + +--- + +## 高级技巧 + +### 自定义代码片段 +```bash +# 打开代码片段设置 +Ctrl + Shift + P -> "Preferences: Configure User Snippets" + +# 示例:创建 React 组件片段 +{ + "React Component": { + "prefix": "rfc", + "body": [ + "import React from 'react';", + "", + "const ${1:ComponentName} = () => {", + " return (", + "
", + " $0", + "
", + " );", + "};", + "", + "export default ${1:ComponentName};" + ], + "description": "Create a React functional component" + } +} +``` + +### 工作区设置 +```bash +# 项目特定设置 +# 在项目根目录创建 .vscode/settings.json +{ + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "files.exclude": { + "**/.git": true, + "**/node_modules": true + } +} +``` + +### 任务配置 +```bash +# 在 .vscode/tasks.json 中配置任务 +{ + "version": "2.0.0", + "tasks": [ + { + "label": "build", + "type": "shell", + "command": "npm run build", + "group": "build" + } + ] +} + +# 运行任务 +Ctrl + Shift + P -> "Tasks: Run Task" +``` + +### 调试配置 +```bash +# 在 .vscode/launch.json 中配置调试 +{ + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Launch Program", + "program": "${workspaceFolder}/index.js" + } + ] +} +``` + +### 使用命令面板 +```bash +# 常用命令 +Ctrl + Shift + P # 打开命令面板 + +# 常用命令列表: +# - "Format Document" 格式化文档 +# - "Organize Imports" 整理导入 +# - "Go to Symbol" 跳转到符号 +# - "Change All Occurrences" 更改所有出现 +# - "Rename Symbol" 重命名符号 +``` + +### AI 提示词技巧 +```bash +# 在 Chat 中使用更好的提示词 + +# ❌ 不好的提示 +"修复这个bug" + +# ✅ 好的提示 +"这个函数在处理空数组时会抛出错误,请添加空值检查并返回默认值" + +# 使用 @ 引用 +@文件名 # 引用特定文件 +@代码库 # 引用整个代码库 +@文档 # 引用文档 + +# 使用特殊命令 +/explain @file.js # 解释文件 +/refactor @function # 重构函数 +/test @component # 生成测试 +``` + +### 代码审查技巧 +```bash +# 使用 AI 进行代码审查 +# 1. 选中代码 +# 2. 在 Chat 中输入: +"请审查这段代码,检查是否有bug、性能问题或可以改进的地方" + +# 使用 Composer 进行大规模审查 +# 1. 打开 Composer +# 2. 选择多个文件 +# 3. 要求 AI 进行整体审查 +``` + +### 批量操作 +```bash +# 使用多光标进行批量操作 +# 1. 选中第一个位置 +# 2. Ctrl + D 选择下一个 +# 3. 继续选择所有需要的位置 +# 4. 同时编辑 + +# 使用查找替换 +Ctrl + H # 打开替换 +# 启用正则表达式 +# 进行批量替换 +``` + +### 代码生成模板 +```bash +# 使用 AI 生成代码模板 +# 在 Chat 中: +"生成一个 React 函数组件,包含以下功能: +- 使用 TypeScript +- 包含 props 类型定义 +- 使用 useState 管理状态 +- 包含错误处理" +``` + +--- + +## 实用配置示例 + +### settings.json 推荐配置 +```json +{ + // 编辑器设置 + "editor.fontSize": 14, + "editor.lineHeight": 1.6, + "editor.tabSize": 2, + "editor.insertSpaces": true, + "editor.formatOnSave": true, + "editor.formatOnPaste": true, + "editor.codeActionsOnSave": { + "source.fixAll": true, + "source.organizeImports": true + }, + + // 文件设置 + "files.autoSave": "afterDelay", + "files.autoSaveDelay": 1000, + "files.exclude": { + "**/.git": true, + "**/node_modules": true, + "**/dist": true, + "**/build": true + }, + + // AI 设置 + "cursor.ai.enabled": true, + "cursor.ai.autoComplete": true, + + // 搜索设置 + "search.exclude": { + "**/node_modules": true, + "**/dist": true, + "**/build": true + } +} +``` + +--- + +## 学习资源 + +### 官方资源 +- [Cursor 官网](https://cursor.com) +- [Cursor 文档](https://docs.cursor.com) +- [Cursor 博客](https://cursor.com/blog) + +### 社区资源 +- [Cursor Discord](https://discord.gg/cursor) +- [GitHub Discussions](https://github.com/getcursor/cursor/discussions) +- [Reddit r/cursor](https://reddit.com/r/cursor) + +### 视频教程 +- YouTube 搜索 "Cursor AI tutorial" +- 官方 YouTube 频道 + +--- + +## 最佳实践 + +### 1. 合理使用 AI +- 不要过度依赖 AI,理解生成的代码 +- 使用 AI 加速开发,但保持代码质量 +- 定期审查 AI 生成的代码 + +### 2. 保持代码整洁 +- 使用格式化工具 +- 及时清理未使用的代码 +- 保持一致的代码风格 + +### 3. 利用快捷键 +- 学习常用快捷键,提高效率 +- 自定义适合自己工作流的快捷键 +- 定期复习快捷键 + +### 4. 组织项目结构 +- 使用工作区设置 +- 配置合理的文件排除规则 +- 保持项目结构清晰 + +### 5. 版本控制 +- 充分利用 Git 集成 +- 定期提交代码 +- 使用有意义的提交信息 + +--- + +## 总结 + +Cursor 是一个强大的 AI 辅助代码编辑器,掌握这些技巧可以大大提高开发效率: + +1. **基础操作**:多光标、快速导航、代码折叠 +2. **AI 功能**:Chat、Composer、内联编辑 +3. **代码编辑**:智能重命名、代码重构、批量操作 +4. **调试技巧**:断点、日志、调试面板 +5. **性能优化**:合理配置、清理缓存、排除文件 + +持续学习和实践这些技巧,让 Cursor 成为你开发路上的得力助手! + +--- + +*最后更新:2024年* diff --git a/docs/dify/密码输入错误次数超过限制时的机制.md b/docs/dify/密码输入错误次数超过限制时的机制.md new file mode 100644 index 0000000..830470e --- /dev/null +++ b/docs/dify/密码输入错误次数超过限制时的机制.md @@ -0,0 +1,70 @@ +## 错误原因 + +这是 Dify 的登录安全机制:当同一邮箱的密码错误次数超过限制时,会临时锁定该邮箱的登录。 + +### 具体机制 + +1. 错误次数限制:最多允许 5 次错误登录尝试(LOGIN_MAX_ERROR_LIMITS = 5) + +2. 锁定时间:默认 24 小时(86400 秒) + +3. 计数方式:每次密码错误会增加计数,存储在 Redis 中 + +### 相关代码 + +login.pyLines 95-97 + +is_login_error_rate_limit = AccountService.is_login_error_rate_limit(args.email) + +if is_login_error_rate_limit: + +    raise EmailPasswordLoginLimitError() + +account_service.pyLines 786-792 + +def add_login_error_rate_limit(email: str): + +    key = f"login_error_rate_limit:{email}" + +    count = redis_client.get(key) + +    if count is None: + +        count = 0 + +    count = int(count) + 1 + +    redis_client.setex(key, dify_config.LOGIN_LOCKOUT_DURATION, count) + +account_service.pyLines 796-805 + +def is_login_error_rate_limit(email: str) -> bool: + +    key = f"login_error_rate_limit:{email}" + +    count = redis_client.get(key) + +    if count is None: + +        return False + +    count = int(count) + +    if count > AccountService.LOGIN_MAX_ERROR_LIMITS: + +        return True + +    return False + +### 解决方案 + +1. 等待锁定时间结束(默认 24 小时) + +2. 管理员可在 Redis 中删除该邮箱的计数记录: + +    redis-cli DEL "login_error_rate_limit:your-email@example.com" + + +3. 使用邮箱验证码登录(如果已启用),不受此限制影响 + +这是防止暴力破解的安全措施,建议等待锁定时间结束或联系管理员处理。 \ No newline at end of file diff --git a/docs/dify/管理员账户.md b/docs/dify/管理员账户.md new file mode 100644 index 0000000..9f9bdec --- /dev/null +++ b/docs/dify/管理员账户.md @@ -0,0 +1 @@ +admin !Rjb0118 \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index a15289e..1793272 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -58,6 +58,7 @@ nav: - 技术文档/部署文档.md - Cursor工具: - cursor/cursor.md + - cursor/cursor使用技巧.md - 学习笔记: - 学习笔记/Java学习.md - 学习笔记/前端学习.md @@ -181,6 +182,7 @@ nav: - Obsidian笔记体系/Projects/saars开发/营养师/健康营养师分析数据.md - Obsidian笔记体系/Projects/saars开发/营养师/营养师分析数据.md - Obsidian笔记体系/Projects/知你-调测/知你--调测.md + - Obsidian笔记体系/Daily/2026-01-14.md - gerrit: - gerrit/gerrit上传代码详细指南.md - gerrit/gerrit分支规范.md @@ -189,10 +191,12 @@ nav: - gerrit/gerrit每日工作流程.md - adb调试命令: - adb调试命令/adb常用命令.md - - adb调试命令/常用linux命令.md + - adb调试命令/linux常用命令.md - dify: - dify/作为安卓高级开发工程师,除了项目管理,你完全可以在技术专项、团队效能和个人成长三大领域构建更懂你的专属助手.md - dify/使用dify,可以生成一个专项事务助手吗,比如公司正规化事务助手.md + - dify/密码输入错误次数超过限制时的机制.md + - dify/管理员账户.md - git: - git/Git add . 后如何撤销.md - git/git同步远程分支总结.md