【问题标题】:Greping multiple lines from one multiline output Bash从一个多行输出中提取多行 Bash
【发布时间】:2016-01-30 14:59:26
【问题描述】:

我有一个带有此输出的命令dumpsys power

    POWER MANAGER (dumpsys power)
    Power Manager State: mDirty=0x0
    mWakefulness=Awake #
    mWakefulnessChanging=false
    mIsPowered=false
    mPlugType=0
    mBatteryLevel=67 #
    mBatteryLevelWhenDreamStarted=0
    mDockState=0
    mStayOn=false #
    mProximityPositive=false
    mBootCompleted=true #
    mSystemReady=true #
    mHalAutoSuspendModeEnabled=false
    mHalInteractiveModeEnabled=true
    mWakeLockSummary=0x0
    mUserActivitySummary=0x1
    mRequestWaitForNegativeProximity=false
    mSandmanScheduled=false
    mSandmanSummoned=false
    mLowPowerModeEnabled=false #
    mBatteryLevelLow=false #
    mLastWakeTime=134887327 (59454 ms ago) #
    mLastSleepTime=134881809 (64972 ms ago) #
    mLastUserActivityTime=134946670 (111 ms ago)
mLastUserActivityTimeNoChangeLights=134794061 (152720 ms ago)
mLastInteractivePowerHintTime=134946670 (111 ms ago)
mLastScreenBrightnessBoostTime=0 (134946781 ms ago)
mScreenBrightnessBoostInProgress=false
mDisplayReady=true #
mHoldingWakeLockSuspendBlocker=false
mHoldingDisplaySuspendBlocker=true
    Settings and Configuration:
mDecoupleHalAutoSuspendModeFromDisplayConfig=false
mDecoupleHalInteractiveModeFromDisplayConfig=true
mWakeUpWhenPluggedOrUnpluggedConfig=true
mWakeUpWhenPluggedOrUnpluggedInTheaterModeConfig=false
mTheaterModeEnabled=false
mSuspendWhenScreenOffDueToProximityConfig=false
mDreamsSupportedConfig=true
mDreamsEnabledByDefaultConfig=true
mDreamsActivatedOnSleepByDefaultConfig=false
mDreamsActivatedOnDockByDefaultConfig=true
mDreamsEnabledOnBatteryConfig=false
mDreamsBatteryLevelMinimumWhenPoweredConfig=-1
mDreamsBatteryLevelMinimumWhenNotPoweredConfig=15
mDreamsBatteryLevelDrainCutoffConfig=5
mDreamsEnabledSetting=false
mDreamsActivateOnSleepSetting=false
mDreamsActivateOnDockSetting=true
mDozeAfterScreenOffConfig=true
mLowPowerModeSetting=false
mAutoLowPowerModeConfigured=false
mAutoLowPowerModeSnoozing=false
mMinimumScreenOffTimeoutConfig=10000
mMaximumScreenDimDurationConfig=7000
mMaximumScreenDimRatioConfig=0.20000005
mScreenOffTimeoutSetting=60000 #
mSleepTimeoutSetting=-1
mMaximumScreenOffTimeoutFromDeviceAdmin=2147483647 (enforced=false)
mStayOnWhilePluggedInSetting=0
mScreenBrightnessSetting=102
mScreenAutoBrightnessAdjustmentSetting=-1.0
mScreenBrightnessModeSetting=1
mScreenBrightnessOverrideFromWindowManager=-1
mUserActivityTimeoutOverrideFromWindowManager=-1
mTemporaryScreenBrightnessSettingOverride=-1
mTemporaryScreenAutoBrightnessAdjustmentSettingOverride=NaN
mDozeScreenStateOverrideFromDreamManager=0
mDozeScreenBrightnessOverrideFromDreamManager=-1
mScreenBrightnessSettingMinimum=10
mScreenBrightnessSettingMaximum=255
mScreenBrightnessSettingDefault=102
Sleep timeout: -1 ms
Screen off timeout: 60000 ms
Screen dim duration: 7000 ms
Wake Locks: size=0 Suspend Blockers: size=4
PowerManagerService.WakeLocks: ref count=0
PowerManagerService.Display: ref count=1
PowerManagerService.Broadcasts: ref count=0
PowerManagerService.WirelessChargerDetector: ref count=0
Display Power: state=ON #

我想以以下格式获取标有 # 的行:

mScreenOffTimeoutSetting=60000
mDisplayReady=true
***
ScreenOfftimeoutSetting = 60000
DisplayReady = true

命令输出可能因设备而异,并且某些行可能不存在或位于不同的位置。因此,如果搜索到的行不存在,则不会产生错误。

【问题讨论】:

  • 发布您的输入和预期输出
  • 如果你的输出是 50-100 行,最好做一个更小的例子(例如 10 行,提取 2 行)。
  • 不需要for 循环。 awk -F= '$1 ~ /^(mSomeValue|someOther|orThirdEtc)$/ { print $2 }' 将从正则表达式中的键中提取值到标准输出。
  • 我用命令的完整输出更新了问题。我试过你的 awk 命令,但由于某种原因它为我返回空白:/
  • 对我有用,因为我得到了我期望的输出:ideone.com/KHxT3j ...该输出是否真的有用是另一个问题,但您的问题陈述只能让我们猜测。 (如果您想忽略前导空格,请在正则表达式中的第一个 ^ 之后添加类似 [ ]* 的内容。)

标签: bash awk output dumpsys


【解决方案1】:

不清楚你想要什么。 Aou 可以使用 sed 从文件中提取变量,然后对它们做任何你想做的事情。这是一个例子:

sed -n -e 's/^mSomeName=\(.*\)/newVariable=\1/p' -e 's/^mOtherName=.*+\(.*\)/newVariable2=\1/p' myFile

解释:

  • -n 默认不输出任何内容
  • -e 后面是一个表达式。这是必需的,因为我们有多个表达式
  • s/^mSomeName=\(.*\)/newVariable=\1/p 如果文件以mSomeName= 开头(^),则捕获后面的内容(\(.*\)),将行替换为newVariable=\1,其中\1 是捕获的内容,然后打印出来(p
  • 's/^mOtherName=.+(.)/newVariable2=\1/p' 类似于前面的表达式,但会捕获 + 符号之后的内容并将其打印在 @ 后面987654332@

这类似于:

$ sed -n -e 's/^mSomeName=\(.*\)/newVariable=\1/p' -e 's/^mOtherName=.*+\(.*\)/newVariable2=\1/p' <<<$'mSomeName=SomeValue\nmOtherName=OtherValue+Somethingelse'
newVariable=SomeValue
newVariable2=Somethingelse

&lt;&lt;&lt;$'...' 是一种将带有换行符\n 的字符串直接传递给bash 中的命令的方法。您可以将其替换为文件。这个命令只是输出一个字符串,不会有任何改变。

如果您在 bash 变量中需要它们,请使用 eval:

$ eval $(sed -n -e 's/^mSomeName=\(.*\)/newVariable=\1/p' -e 's/^mOtherName=.*+\(.*\)/newVariable2=\1/p' <<<$'mSomeName=SomeValue\nmOtherName=OtherValue+Somethingelse')
$ echo newVariable=$newVariable - newVariable2=$newVariable2
newVariable=SomeValue - newVariable2=Somethingelse

eval 将执行在这种情况下设置变量值的字符串:

$ eval a=1
$ echo $a
1

【讨论】:

    【解决方案2】:

    如果你只想使用 Grep 命令,你可以使用 -A (After) 和 -B (Before) 选项和管道。

    这是一个有 2 行的示例。

    文件 test.txt:

    test
    aieauieaui
    test
    caieaieaipe
    
    mSomeName=SomeValue
    mOtherName=OtherValue+Somethingelse
    nothing
    blabla
    mSomeName=SomeValue2
    mOtherName=OtherValue+Somethingelse2
    

    要使用的命令:

    grep -A 1 'mSomeName' test.txt |grep -B 1 'mOtherName'
    

    输出:

    mSomeName=SomeValue
    mOtherName=OtherValue+Somethingelse
    --
    mSomeName=SomeValue2
    mOtherName=OtherValue+Somethingelse2
    

    【讨论】:

    • 这不起作用,因为输出可能因设备而异,但无论如何感谢您的回答:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多