指令
指令结构
在Linux下,指令由命令和选项组成,并且可以包含参数和操作数。以下是指令的一般结构:
command [option(s)] [argument(s)]
command表示要执行的命令或程序名称。option(s)是可选的,用于修改命令的行为或提供额外的功能。选项通常以短划线(-)或双短划线(--)开头。argument(s)是命令的参数或操作数,用于提供命令操作所需的信息。
|
利用Linux所提供的管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入。连续使用管道意味着第一个命令的输出会作为 第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推。
> 重定向符号
> 是一个重定向符号,用于将命令的输出重定向到文件中。它不是cat命令特有的,而是用于shell(命令行解释器)的通用功能。
在 cat file1.txt file2.txt > merged.txt 这个例子中,> 符号将 cat file1.txt file2.txt 命令的输出重定向到 merged.txt 文件中。这意味着 file1.txt 和 file2.txt 的内容将被合并,并写入到 merged.txt 文件中。如果 merged.txt 文件不存在,则会创建该文件;如果文件已存在,则会覆盖文件的内容。
除了 > 符号外,还有其他一些重定向符号可以用于不同的目的:
>>:追加重定向符号。将命令的输出追加到文件的末尾,而不是覆盖文件的内容。<:输入重定向符号。将文件的内容作为命令的输入。2>:错误重定向符号。将命令的错误输出重定向到文件中。
这些重定向符号是shell的通用功能,可以与各种命令一起使用。
比如说
cat example.txt > example2.txt,本来cat example.txt执行后是将内容输出到标准输出(stdout)中的,这也是几乎所有命令的输出地方,也就是显示到屏幕上给我们看,而>正是让命令产生结果后拦截掉,不再让该命令输出到stdout,而是我们指定的位置。
grep
grep是Linux系统中一个非常有用的文本搜索工具。它可以在指定的文件或输入中搜索匹配给定的正则表达式或字符串的行。
grep的一般语法是:
grep [选项] '正则表达式' 文件名
例如,要在文件中搜索含有"linux"字符串的行,可以使用:
grep linux 文件
grep的一些常用选项包括:
-i:不区分大小写
-v:反向选择,显示不匹配的行
-c:只输出匹配的行数
-n:输出行号
-l:只输出包含匹配内容的文件名
grep是一个强大的文本搜索工具,可以帮助用户快速地在Linux系统中查找需要的内容。配合正则表达式,可以实现非常复杂和高级的文本匹配搜索。
正则表达式
正则表达式(Regular Expression)是一种文本模式,用于在文本中查找匹配某个模式的字符串。
正则表达式的一些常见规则包括:
.- 匹配任意单个字符*- 匹配前一个元素0次或多次+- 匹配前一个元素1次或多次?- 匹配前一个元素0次或1次[]- 匹配方括号内的任意一个字符[^]- 匹配不在方括号内的任意一个字符|- 或,匹配竖线两边的任意一个表达式()- 分组\d- 匹配数字\w- 匹配字母或数字\s- 匹配任意空白符(空白符号,tab,换行符,回车符,换页符)\S匹配所有非空白字符(\s 的反义):^- 匹配字符串的开始$- 匹配字符串的结束{n}匹配确定的n次{n,}至少匹配n次{n,m}匹配至少n次,至多m次- 使用
^表示行的开始。 - 使用
$表示行的结束。 - (?:pattern)不会单独取出pattern匹配到的内容
.* //默认贪婪模式
// 所有量词都可以加 ? 变成非贪婪
* → *? // 0 次或多次(非贪婪)
+ → +? // 1 次或多次(非贪婪)
? → ?? // 0 次或 1 次(非贪婪)
{n,m} → {n,m}? // n 到 m 次(非贪婪)
通过组合这些基本规则,可以构建非常复杂和强大的正则表达式,用来匹配文本中的模式。
匹配含有指定文本的一整行
匹配包含“hello”的整行,正则表达式为^.*hello.*$。
也就是在匹配行尾加上^.*和.*$
匹配需要转义的字符
正则中匹配单个反斜杠 \ 需要写成 \\
(?:pattern)
// 匹配日期格式(YYYY-MM-DD),但不需要单独获取分隔符
const regex = /(\d{4})(?:-)(\d{2})(?:-)(\d{2})/;// js中,正则需要使用//包裹,表示这个是一个正则,而不是使用引号包裹。
const date = "2023-10-05";
console.log(date.match(regex));
// 输出: ["2023-10-05", "2023", "10", "05"]
虚拟文件
当你执行 cat /proc/7884/maps 命令时,你是在查看 /proc/7884/maps 这个文件的内容。这个文件并不是一个常规的文件,而是一个在 /proc 文件系统中的特殊文件。
/proc 文件系统是一种伪文件系统(也被称为虚拟文件系统),它在内存中创建,而不是在硬盘上。/proc 文件系统包含了大量关于系统和正在运行的进程的信息。这些信息是由内核实时生成的。
例如,/proc/[pid]/maps 文件包含了进程 [pid] 的内存映射信息。当你使用 cat 命令读取这个文件时,你实际上是在获取由内核实时生成的关于该进程的内存映射信息,而不是在执行某个命令。
所以,当你执行 cat /proc/7884/maps 时,你是在查看进程 7884 的内存映射信息,而不是在执行 /proc/7884/maps 这个命令。
ADB
什么是ADB
在安卓开发中,ADB是Android Debug Bridge的缩写,它是一个用于与Android设备进行通信和调试的命令行工具。ADB提供了一组命令和功能,使开发者能够与连接的Android设备或模拟器进行交互,并执行各种操作,包括应用程序安装、文件传输、日志记录、调试等。
ADB常用指令
以下是一些常见的ADB命令示例:
adb devices:列出当前连接的Android设备或模拟器。adb install <apk_file>:安装一个APK文件到目标设备。adb uninstall <package_name>:卸载指定包名的应用程序。adb shell:进入目标设备的shell环境,可以执行命令和访问设备文件系统。adb push <local_file> <remote_path>:将本地文件复制到目标设备上指定路径。adb pull <remote_file> <local_path>:从目标设备上复制文件到本地路径。adb logcat:查看设备上的系统日志和应用程序日志。
SHELL
什么是shell
shell是Linux系统中的一个命令解释器。它为用户提供了一个向Linux内核发送请求以便运行程序的界面,是用户与操作系统之间的桥梁。
shell的主要作用包括:
- 接受用户的命令并调用相应的应用程序。shell本身不做事情,它只是运行用户所要求的应用程序。
- 为用户提供了一个向Linux内核发送请求以便运行程序的界面。
- 操作文件和目录。大部分的文件和目录管理任务都可以通过shell来完成。
- 执行操作系统命令,例如ls, cp, mv等。这些命令实际上都是可执行的程序,shell能够找到并执行这些命令。
- 连接linux中的各个程序,实现在一个命令行中运行多个程序。
- 为用户提供了编程功能,可以编写shell脚本来执行各种任务。
- 自定义和自动化命令,减少重复输入。
- 提供丰富的功能,支持命令历史、命令补全、通配符、管道等机制。
也就是相当于windows下的cmd
使用Android中的指令
首先我们需要通过adb shell进入指定的安卓设备
用到的指令:
如果你想进入通过usb连接的安卓手机,可以使用这个指令,当然只允许有一个usb连接的手机才可用:
adb -d shell
-d 解释:use USB device (error if multiple devices connected)
或者指定连接的设备:
adb -s 设备号 shell
-s SERIAL 解释: use device with given serial (overrides $ANDROID_SERIAL)
设备号需要通过adb -devices获取。
logcat
-
adb logcat ":E"
-
adb logcat MyTag:D ":S"
-
adb logcat --pid 12345
-
adb logcat --uid 10123
-
adb logcat -e "ddd" -e表示要显示的包含的文本内容
-
adb logcat -d 表示输出完自动退出
logcat -b 用来选择要读取的日志缓冲区(buffer)。
- 常见缓冲区:
- main:应用普通日志(默认)
- system:系统组件日志
- radio:电话/无线相关
- events:结构化事件
- crash:崩溃专用日志
- kernel:内核日志(设备支持时)
- 示例:
- 只看崩溃:adb logcat -b crash -d
- 同时看多个:adb logcat -b main -b system
- 查看容量:adb logcat -g -b all
- 调大容量:adb logcat -G 20M -b all
过滤tag
只显示指定tag
logcat -s tag
等同于
logcat tag:D *:S
logcat tag:D的意思是显示tag的Debug等级,但是其他tag也会显示
bugreport
which
which是一个常用的命令行工具,用于查找给定命令的可执行文件的路径。当你在终端中输入一个命令时,系统会根据环境变量中定义的路径来查找该命令的可执行文件。which命令可以告诉你系统在哪个目录下找到了该命令的可执行文件。
例如,如果你在终端中输入which ls,系统会在环境变量定义的路径中查找ls命令的可执行文件,并返回该文件的路径(例如/bin/ls)。如果系统找不到该命令,which命令将不会返回任何内容。
which命令通常用于确定系统上是否安装了特定的命令或程序,并查找它们的位置。这对于调试和查找特定命令的路径非常有用。
1|rubens:/ $ which ls
/system/bin/ls
安卓特有指令dumpsys
用于获取系统服务的调试信息和状态。它可以提供有关设备各个方面的详细信息,如活动管理器、包管理器、电池状态、网络状态、传感器、窗口管理器等。
通过运行dumpsys命令,你可以获取关于设备当前状态和正在运行的应用程序的各种信息。例如,你可以使用dumpsys battery获取有关电池的详细信息,使用dumpsys activity获取有关活动管理器的信息,使用dumpsys wifi获取有关Wi-Fi状态的信息,以此类推。
rubens:/ $ dumpsys battery
Current Battery Service state:
AC powered: true
USB powered: false
Wireless powered: false
Max charging current: 0
Max charging voltage: 0
Charge counter: 4706000
status: 2
health: 2
present: true
level: 100
scale: 100
voltage: 4423
temperature: 344
technology: Li-poly
dumpsys命令可以获取的信息非常丰富,以下是一些常见的示例:
dumpsys battery:获取有关电池状态和电量的信息。dumpsys activity:提供有关活动管理器和应用程序的信息,如运行的活动、任务堆栈、进程等。dumpsys package:显示已安装应用程序的信息,包括包名、版本、权限等。dumpsys wifi:提供有关Wi-Fi连接状态和配置的信息。dumpsys bluetooth:获取有关蓝牙设备和连接状态的信息。dumpsys telephony.registry:显示与电话和移动网络相关的信息,如信号强度、SIM卡状态等。dumpsys sensor:提供有关设备上可用传感器的信息,如加速度计、陀螺仪、光线传感器等。dumpsys window:显示窗口管理器的信息,包括屏幕分辨率、显示器配置、窗口层次等。dumpsys meminfo:获取系统内存使用情况的详细信息。dumpsys cpuinfo:显示CPU使用情况的信息。gfxinfo:有关图形渲染性能和GPU使用情况的信息。
dumpsys activity会经常用到,dumpsys activity 的常用用法:
-
列出所有活动的信息:
dumpsys activity activities这个命令会显示所有活动的状态,包括当前运行的活动、暂停的活动以及在活动栈中的活动。
-
查看特定活动的信息:
dumpsys activity <activity-name>如果你只对特定的活动感兴趣,可以直接通过活动名来查询。
-
查看任务信息:
dumpsys activity tasks这个命令会显示所有任务的信息,包括每个任务中的活动栈。
-
查看服务信息:
dumpsys activity services <service-name>如果你想要获取特定服务的信息,可以使用这个命令。
-
查看应用的内存信息:
dumpsys procstats这个命令提供了应用的内存使用情况统计。
-
查看Intent信息:
dumpsys activity intents这个命令显示当前正在处理的Intent信息。
-
查看历史记录:
dumpsys activity hist这个命令可以用来查看最近的活动历史记录。
-
筛选特定应用的信息:
dumpsys activity <package-name>如果你只对特定应用的活动和服务感兴趣,可以直接通过包名来筛选信息。
-
获取顶部活动的信息:
dumpsys activity top这个命令会显示当前在前台的活动。
dumpsys 命令的输出可能非常长,因此通常会将它配合 grep 命令使用,以便筛选出感兴趣的信息。例如,你可以使用以下命令来查找与特定应用相关的活动信息:
dumpsys activity | grep com.example.myapp
cat
cat是一个常用的命令行工具,用于在终端中查看文件内容或将多个文件合并输出。它的名称代表"concatenate"(连接),它的主要功能是将文件内容连接在一起并输出到终端。
以下是几个cat命令的示例用法:
-
查看文件内容:你可以使用
cat命令来查看文本文件的内容。例如,如果你有一个名为example.txt的文本文件,可以运行以下命令来在终端中显示该文件的内容:cat example.txt -
合并文件:
cat命令还可以将多个文件的内容合并输出到一个文件中。例如,如果你有两个名为file1.txt和file2.txt的文本文件,可以使用以下命令将它们的内容合并到一个新文件merged.txt中:cat file1.txt file2.txt > merged.txt -
通过管道传递数据:
cat命令还可以与其他命令一起使用,通过管道(|)将一个命令的输出作为另一个命令的输入。例如,以下命令将file.txt文件的内容传递给grep命令进行匹配:cat file.txt | grep "keyword"
这些只是cat命令的一些常见用法示例,它还有其他选项和功能,可以根据需要进行使用。你可以通过在终端中运行man cat命令来查看更多关于cat命令的详细信息和用法说明。
ls显示文件类型
要让ls命令显示文件类型,可以使用-F选项。-F选项会在文件名后面添加一个字符,表示文件的类型。
下面是一个示例:
ls -F
这将显示当前目录下的所有文件和文件夹,并在文件名后面添加一个字符来表示文件类型。常见的字符表示如下:
/表示目录*表示可执行文件@表示符号链接|表示FIFO(命名管道)=表示套接字- 无特殊字符表示普通文件
例如,如果当前目录中有一个名为example.txt的文本文件和一个名为myfolder的文件夹,使用ls -F命令将显示如下结果:
example.txt
myfolder/
其中,example.txt后面没有特殊字符,表示它是一个普通文件,而myfolder/后面有/字符,表示它是一个文件夹。
其中
@符号链接
符号链接(Symbolic Link),也被称为软链接(Soft Link),是一种特殊类型的文件,它是指向另一个文件或目录的引用。符号链接类似于Windows系统中的快捷方式或Mac系统中的别名。
与实际的文件或目录不同,符号链接本身只是一个指向目标文件或目录的路径,而不包含实际的数据。当你打开或访问符号链接时,系统会自动跟随链接并访问链接所指向的目标文件或目录。
使用符号链接的主要优点是它们提供了一种灵活的方式来引用文件或目录,而不需要复制或移动实际的数据。这使得你可以创建一个指向其他位置的链接,而不需要在多个位置保留副本。
在文件系统中创建符号链接的常见命令是ln -s。以下是一个创建符号链接的示例:
ln -s /path/to/target linkname
其中,/path/to/target是目标文件或目录的路径,linkname是符号链接的名称。创建成功后,可以通过linkname访问目标文件或目录。
符号链接在命令行中常用于创建快捷方式、跨文件系统引用文件、创建可移植的脚本等场景。
| 表示FIFO(命名管道)和套接字文件
FIFO(First-In-First-Out)是一种特殊类型的文件,也被称为命名管道(Named Pipe)。它提供了进程间通信的一种方式,允许不相关的进程通过读取和写入FIFO来进行数据传输。
FIFO在文件系统中以文件的形式存在,但它并不是传统意义上的文件。它允许一个或多个进程以顺序的方式读取和写入数据,就像数据在管道中流动一样。一个进程可以将数据写入FIFO,并由另一个进程从FIFO读取数据,实现进程间的数据交换。
FIFO通常用于需要在不同进程之间传递数据的情况,特别是在使用命令行工具或脚本编程时。它提供了一种简单而有效的方式来实现进程间通信。
套接字(Socket)是一种在网络编程中使用的通信机制。它允许不同的计算机通过网络进行通信。在Unix-like系统中,套接字也以文件的形式存在于文件系统中。
套接字文件在文件系统中被视为一种特殊类型的文件,用于进程之间的网络通信。通过套接字,进程可以建立网络连接、发送和接收数据,以实现网络通信的功能。
查看日志利器 tail
tail命令用于显示文件的末尾内容,默认情况下,它会显示文件的最后10行。该命令在查看日志文件、实时监视文件变化或仅查看文件的最新部分时非常有用。
tail命令的基本语法如下:
tail [选项] 文件名
其中,选项是可选的,用于指定不同的行为和输出格式。常用的选项包括:
-n <行数>:指定要显示的行数。例如,tail -n 20 file.txt将显示文件file.txt的最后20行。-f:实时跟踪文件的变化,并持续输出新增的内容。适用于查看日志文件等实时更新的文件。fFollow FILE(s) by descriptor, waiting for more data to be appendedFFollow FILE(s) by filename, waiting for more data, and retrying
f和F的不同:
tail -F命令会在文件重新出现时自动重新打开,即使文件被删除或重命名后再次创建,或者文件被移动到另一个位置。这样,即使你在使用tail -F命令时修改了文件,它也会继续监视并正确显示更新的内容。
如果tail -f没有实时更新文件内容,很可能是你的文件修改后重新创建了同名文件,而tail -f不会尝试监控新创建的文件,这时候改用tail -F即可。
例如,要显示文件example.txt的最后5行,可以运行以下命令:
tail -n 5 example.txt
执行该命令后,example.txt文件的最后5行内容将被显示在终端窗口上。
如果你希望实时跟踪文件的变化,可以使用tail -f命令。例如,要实时监视名为logfile.txt的日志文件,可以运行以下命令:
tail -f logfile.txt
或者
tail -F logfile.txt
执行该命令后,tail命令将不断输出logfile.txt文件新增的内容,方便你实时查看日志更新。
top
用来显示实时系统监控工具
-H Show threads
-h Usage graphs instead of text
-k Fallback sort FIELDS (default -S,-%CPU,-ETIME,-PID)
-o Show FIELDS (def PID,USER,PR,NI,VIRT,RES,SHR,S,%CPU,%MEM,TIME+,CMDLINE)
-O Add FIELDS (replacing PR,NI,VIRT,RES,SHR,S from default)
-s Sort by field number (1-X, default 9)
-b Batch mode (no tty)
-d Delay SECONDS between each cycle (default 3)
-m Maximum number of tasks to show
-n Exit after NUMBER iterations
-p Show these PIDs
-u Show these USERs
-q Quiet (no header lines)
比如:我要显示前6名的进程,并且疫苗刷新一次
top -d 1 -m 6
watch
watch是一个命令行实用程序,用于周期性地运行指定的命令,并在终端上实时显示其输出。它可以帮助你监视命令的执行结果,以及随着时间的推移的变化。
watch命令的基本语法如下:
watch [options] command
其中,options是一些可选的参数,用于定制watch命令的行为,而command是要周期性运行的命令。
watch命令的默认行为是每2秒钟运行一次指定的命令,并在终端上显示其输出。它会将前一次运行结果与当前运行结果进行比较,只显示发生变化的部分。
以下是一些常用的watch命令选项:
-n <秒数>:指定刷新间隔,即运行命令的时间间隔。-d:高亮显示发生变化的部分。-t:在每行的顶部显示当前时间。-c:清除屏幕并在每次刷新时显示命令的输出。-b:以批处理模式运行watch,将输出发送到标准输出而不是交互式界面。
以下是一个示例,演示如何使用watch命令每隔1秒钟监视系统的负载情况:
watch -n 1 uptime
上述命令将每秒运行一次uptime命令,并在终端上实时显示系统的负载情况。你可以根据需要替换uptime命令为其他命令,以监视不同的系统信息或进程活动。
awk
可以看这篇:juejin.cn/post/684516…
安卓特有指令 pm
pm全称是:Package manager
打印应用路径
path [--user USER_ID] PACKAGE
例如:pm path 包名
打印该应用的路径 data/app下的
dump PACKAGE
他会输出各种该应用的信息,比如有哪些activity,哪些service contentprovide 请求的权限 等等
还会对权限进行分类 :动态请求的权限、安装权限、运行时权限
list features
打印系统特征(系统具有的能力)
PackageManager 类的 hasSystemFeature() 方法来检查设备是否支持特定的系统特性。例如,以下代码片段演示了如何检查设备是否支持相机功能:
PackageManager packageManager = getPackageManager();
boolean hasCamera = packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA);
if (hasCamera) {
// 设备支持相机功能,执行相应操作
} else {
// 设备不支持相机功能,执行其他操作
}
在这个例子中,PackageManager.FEATURE_CAMERA 是用于检查相机功能的系统特性常量。如果设备支持相机功能,则 hasCamera 将为 true,否则为 false。
系统特性可以是各种功能,例如相机、蓝牙、NFC(近场通信)、多点触控、网络连接类型(如WiFi和移动数据)、传感器(如加速度计和陀螺仪)等。通过使用系统特性,
list libraries
列出系统库
list packages [-f] [-d] [-e] [-s] [-3] [-i] [-l] [-u] [-U] [--show-versioncode] [--apex-only] [--uid UID] [--user USER_ID] [FILTER]
[FILTER] 可选项表示过滤包含该文字的包名,如果留空则打印出所有
Prints all packages; optionally only those whose name contains the text in FILTER. Options are:
-f: see their associated file
-a: all known packages (but excluding APEXes)
-d: filter to only show disabled packages
-e: filter to only show enabled packages
-s: filter to only show system packages
-3: filter to only show third party packages
-i: see the installer for the packages
-l: ignored (used for compatibility with older releases)
-U: also show the package UID
-u: also include uninstalled packages
--show-versioncode: also show the version code
--apex-only: only show APEX packages
--uid UID: filter to only show packages with the given UID
--user USER_ID: only list packages belonging to the given user
例如:打印出包名包含miui的包:
查看正在运行的进程
ps 是一个用于显示当前进程状态的命令。它在 Unix 和类 Unix 系统(如 Linux、Android 等)中都有使用。它提供了查看进程列表和相关信息的能力。
在 Android 中,ps 命令常用于查看正在运行的进程及其相关信息,例如进程 ID(PID)、内存占用等。
常见用法:
1. 显示所有进程信息:
ps
这将列出当前用户的所有进程。
2. 显示所有进程信息,包括其他用户的进程:
ps -A
这将显示所有用户的所有进程。
3. 显示完整的进程信息,包括命令行参数:
ps -e
4. 显示指定用户的进程信息:
ps -U <用户名>
将 <用户名> 替换为要显示进程信息的特定用户名。
5. 查找指定进程名的进程信息:
ps | grep <进程名>
将 <进程名> 替换为你要查找的进程名或部分名称。grep 命令用于过滤出包含指定名称的进程。
6. 以树状形式显示进程关系:
ps -e --forest
这将以树状结构显示进程间的关系。
7. 仅显示进程的 PID 和名称:
ps -eo pid,comm
这将只显示进程的 PID(进程 ID)和名称。
8. 以用户和时间的格式显示进程信息:
ps -eo user,pid,ppid,cmd,%cpu,%mem,etime
这将显示用户、PID、父进程 PID、命令行、CPU 使用率、内存使用率和运行时间等信息。
这些是常见的 ps 命令用法,可以帮助你查看进程信息并进行系统调试或监控。在 Android 设备上,ps 命令通常在 adb shell 中使用,用于查看设备上的进程信息。
获取目录权限
由于单纯使用cat /proc//maps,会提示没有权限,使用run-as可以获取读取权限
-
使用
run-as命令:
在 Android 设备上,可以使用run-as命令获取应用的专用目录权限。首先,连接设备并通过adb shell进入设备的 shell。然后执行以下命令:adb shell run-as <应用程序包名> cat /proc/<PID>/maps这将以应用程序的用户权限运行
cat命令,尝试读取指定进程的/proc/<PID>/maps文件。请注意,
<应用程序包名>应该替换为目标应用程序的包名,而<PID>应该替换为你要查看的进程的 PID。