学习_Linux_Command_grep_02

本文深入探讨了正则表达式的使用技巧,包括锚定、字符匹配、分组等核心参数,通过实例展示了如何利用正则表达式解决实际问题。
三、pattern正则表达式主要参数
^
锚定行的开始 如:'^grep'匹配所有以grep开头的行。
$
锚定行的结束 如:'grep$'匹配所有以grep结尾的行。
.
匹配一个非换行符('\n')的字符如:'gr.p'匹配gr后接一个任意字符,然后是p。
*
匹配零个或多个先前字符 如:' *grep' (注意*前有空格)匹配所有零个或多个空格后紧跟grep的行,需要用egrep 或者grep带上 -E 选项。 .*一起用代表任意字符。
[]
匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。
[^]
匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-F和H-Z的一个字母开头,紧跟rep的行。
..
标记匹配字符,如'love',love被标记为1。
\<
锚定单词的开始,如:'\<grep'匹配包含以grep开头的单词的行。
\>
锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。
x\{m\}
重复字符x,m次,如:'o\{5\}'匹配包含5个o的行。
x\{m,\}
重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行。
x\{m,n\}
重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行。
\w
匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。
\W
\w的反置形式,匹配一个或多个非单词字符,如点号句号等。
\b
单词锁定符,如: '\bgrep\b'只匹配grep。[1] 
用于egrep和 grep -E的元字符扩展集
\+
匹配一个或多个先前的字符。如:'[a-z]\+able',匹配一个或多个小写字母后跟able的串,如loveable,enable,disable等。
\?
匹配零个或一个先前的字符。如:'gr\?p'匹配gr后跟一个或没有字符,然后是p的行。
a\|b\|c
匹配a或b或c。如:grep|sed匹配grep或sed


分组符号,如:loveab≤∥rsov\+匹配loveable或lovers,匹配一个或多个ov。
<think>嗯,用户想了解如何在Linux中设置boot_command_line的值,可能通过修改/proc/cmdline或者引导参数。我之前已经回答过关于如何将bootargs入/proc/cmdline的问题,但用户现在更深入,涉及到boot_command_line的赋值,这可能涉及内核层面的修改。首先,我需要确认boot_command_line是什么。在内核启动过程中,boot_command_line是存储启动参数的全局变量,通常在setup_arch函数中初始化,来自引导程序传递的参数。用户可能想直接修改这个变量,或者了解如何影响它的值。用户提到通过/proc/cmdline或其他方法配置。之前的回答已经指出/proc/cmdline是只读的,无法直接修改,必须通过引导加载程序。但用户现在的问题可能更偏向于内核开发,比如在内核源码中直接设置boot_command_line,或者在运时动态修改,这可能涉及到内核模块或补丁。接下来,我需要考虑正确的途径。修改boot_command_line通常在内核启动前,通过引导参数设置。如果用户想在内核运时修改,可能需要重新构建内核或使用内核模块,但这可能有风险,也不推荐。另外,用户的问题可能涉及到内核开发或调试,比如在编译内核时预设参数,或者通过设备树传递参数。需要分情况讨论:编译时设置、引导加载程序设置、运时修改的可能性。 还要注意,boot_command_line在内核初始化后就不再改变,因此运时修改可能无效,除非在内核启动的早期阶段。需要查阅内核源码,确认相关流程,比如在setup_arch中如何获取参数。 可能需要引导用户通过修改内核启动参数的正确方法,比如U-Boot或GRUB,而不是直接操作/proc/cmdline。同时,如果用户确实需要在内核代码中预设参数,可以修改内核源码中的default_command_line,并重新编译。需要区分用户的使用场景:是嵌入式开发需要固化参数,还是普通用户想临时修改启动参数。根据不同的场景提供不同的方法,并强调直接修改boot_command_line的风险和复杂性。最后,生成相关问题,引导用户进一步了解启动参数的相关知识,比如内核参数传递机制、设备树的作用等。</think>### 如何在 Linux 中设置 `boot_command_line` 的值? #### 核心结论 **`boot_command_line` 是内核启动时初始化的全局变量**,存储内核启动参数(如 U-Boot/GRUB 传递的 `bootargs`)。其值在系统启动时由引导加载程序决定,**无法在运时直接修改**[^1][^3]。若需自定义,需通过以下方法: 1. **修改引导加载程序参数**(如 U-Boot 的 `bootargs` 或 GRUB 的 `GRUB_CMDLINE_LINUX`) 2. **在内核源码中预设默认值**(需重新编译内核) 3. **通过设备树(Device Tree)传递参数**(嵌入式系统适用) --- #### 一、`boot_command_line` 的初始化机制 `boot_command_line` 在内核启动流程中由 `setup_arch()` 函数初始化,其值来源于引导加载程序传递的原始参数。例如,在 ARM 架构中: ```c // arch/arm/kernel/setup.c void __init setup_arch(char **cmdline_p) { strlcpy(boot_command_line, CONFIG_CMDLINE, COMMAND_LINE_SIZE); // ... } ``` 若内核配置项 `CONFIG_CMDLINE` 定义了默认参数,它将覆盖引导加载程序的参数[^1]。 --- #### 二、设置 `boot_command_line` 的方法 ##### 方法 1:通过引导加载程序设置(推荐) - **U-Boot** ```bash setenv bootargs 'console=ttyS0 root=/dev/mmcblk0p2 rw' # 直接定义参数 saveenv bootelf 0x82000000 ``` - **GRUB** 修改 `/etc/default/grub` 中的 `GRUB_CMDLINE_LINUX`,运 `update-grub` 后重启生效[^1][^3]。 ##### 方法 2:在内核源码中预设默认值 1. **修改内核配置** 在 `.config` 文件中设置 `CONFIG_CMDLINE`: ```bash CONFIG_CMDLINE="console=ttyS0 root=/dev/mmcblk0p2 rw" ``` 2. **重新编译内核** ```bash make oldconfig && make -j$(nproc) ``` 此方法会将参数硬编码到内核中[^1]。 ##### 方法 3:通过设备树传递参数 在设备树文件中添加 `chosen` 节点: ```dts chosen { bootargs = "console=ttyS0 root=/dev/mmcblk0p2 rw"; }; ``` 内核启动时会优先读取此参数[^2]。 --- #### 三、验证 `boot_command_line` 的值 1. **查看 `/proc/cmdline`** ```bash cat /proc/cmdline # 输出与 boot_command_line 一致 ``` 2. **内核日志检查** ```bash dmesg | grep "Command line" # 显示实际加载的参数 ``` --- #### 四、运时动态修改的限制 - **内核符号重定向(仅调试)** 可通过动态修改符号表(需关闭 `CONFIG_STRICT_KERNEL_RWX`)强覆盖 `boot_command_line` 的值: ```c // 内核模块示例 #include <linux/init.h> #include <linux/module.h> extern char *boot_command_line; static int __init demo_init(void) { strncpy(boot_command_line, "new_args", COMMAND_LINE_SIZE); return 0; } module_init(demo_init); ``` **注意**:此方法可能导致系统不稳定,且修改后参数不会影响已初始化的子系统[^4]。 --- ### 相关问题 1. 如何通过设备树动态覆盖 U-Boot 传递的 `bootargs`? 2. 内核编译时 `CONFIG_CMDLINE` 与设备树参数的优先级如何?[^1][^2] 3. 为什么修改 `/proc/cmdline` 无法影响已运的内核?[^3] 4. 如何调试因 `boot_command_line` 参数错误导致的设备初始化失败? 5. 内核启动后能否通过 `/sys` 接口修改 `boot_command_line` 的派生参数?[^4] [^1]: 内核启动参数初始化流程与 `CONFIG_CMDLINE` 的作用 [^2]: 设备树对启动参数的传递机制 [^3]: `/proc/cmdline` 的只读属性与内核运时数据保护 [^4]: 内核符号重定向与运时内存保护机制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值