【问题标题】:How to extract value of root variable from kernel commandline如何从内核命令行中提取根变量的值
【发布时间】:2015-05-29 08:11:57
【问题描述】:

我想在下面的内核命令行中提取设置为根变量的值,我不想使用 awk 列号。

console=ttyO0,115200n8 noinitrd mem=256M root=/dev/mmcblk0p2 rw rootfstype=ext4 rootwait=1 ip=none

我可以使用以下命令提取它,但这取决于根变量的位置,但如果该位置发生变化,它将不起作用

cat /proc/cmdline | awk '{print $4}' | cut -d '=' -f2

任何建议/提示/指针?

编辑
所有答案都是正确的,我接受 Aaron 的答案,因为他是第一个回复的。

【问题讨论】:

    标签: linux bash sh busybox


    【解决方案1】:

    sed 在这里效果更好:

    cat /proc/cmdline | sed -e 's/^.*root=//' -e 's/ .*$//'
    

    第一个表达式删除root= 和之前的所有内容。第二个删除下一个空格和之后的所有内容。

    【讨论】:

    • sed 在性能方面表现更好?还是就简单而言?
    • 就我必须编写的复杂代码而言 :-) anubhava 的解决方案也不错,但我更喜欢对称。
    【解决方案2】:
    $ echo $root
    
    $ cat /proc/cmdline | grep -o '\broot=[^ ]*'
    root=/dev/mapper/VolGroup-lv_root
    $ eval $(cat /proc/cmdline | grep -o '\broot=[^ ]*')
    $ echo $root
    /dev/mapper/VolGroup-lv_root
    

    【讨论】:

    • 感谢您的回复。我读了 grep '-o' 的手册页,意思是“--only-matching”,但请你解释一下后面的部分吗?
    • '\broot=[^ ]*' 是一个正则表达式:\b => 单词开头; [^ ]* => 任意数量的任意(空格除外)字符。因此,'grep' 命令会得到一个类似 "root=xxxx" 的字符串。 'eval' 该字符串然后将环境变量“root”设置为 xxxx
    【解决方案3】:

    另一个awk:

    cat /proc/cmdline | awk -v RS=" " '/^root=/ {print substr($0,6)}'
    

    它使用RS(记录分隔符)将每个以空格分隔的参数拆分为不同的awk 记录。然后,pattern 和substr() 函数都可以引用找到的记录的开头。

    【讨论】:

    • 这是一个简单易懂的解决方案。
    • 感谢 yolenoyer 的回复。 substr($0,6) 是什么意思?因为如果我将它更改为 substr($1,6),它会给出相同的输出。
    • $0 是整条记录,$1 是这条记录的第一个字段。因为那里只有一个字段,所以它们是相等的。
    • awk -F= -v RS=" " '/^root=/ {print $2}' /proc/cmdline
    【解决方案4】:

    你可以使用:

    awk -F 'root=' '{sub(/ .*$/, "", $2); print $2}' /proc/cmdline
    /dev/mmcblk0p2
    

    不使用正则表达式甚至更短:

    awk -F '=' '$1=="root"{print $2}' RS=" " /proc/cmdline
    /dev/mmcblk0p2
    

    awk 命令使用root= 作为字段分隔符,并将root= 之后的所有内容作为$2(第二个字段)。 sub 函数会删除在 $2 中留下 /dev/mmcblk0p2 并打印出来的所有内容。

    【讨论】:

    • 谢谢您的回复,如果可以请您解释一下吗?
    • 好的,我在回答中添加了一些解释,如果您有任何进一步的说明,请告诉我。
    • 如果你想要更小的方法,那么grep -oP 'root=\K\S+' /proc/cmdline
    • 对我来说第二个很容易理解,谢谢 Anubhava。
    • 是的,第二个无疑更简单,而且由于非正则表达式的使用和更短的命令,我的偏好也是如此。
    猜你喜欢
    • 2018-02-02
    • 2020-07-06
    • 2015-07-04
    • 1970-01-01
    • 2022-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多