从某一行搜索文件中的字符串

时间:2019-04-15 11:04:44

标签: linux bash

如何使用bash脚本在文本文件中的某行搜索字符串?

例如我想搜索第一次出现的"version:"字符串,但不是在文件开头,而是在行号。说35,其中包含文本*-disk:0,这样我将只获得disk-0的产品名称,而没有其他东西。 我当前的方法如下,其中line_no是行号。 disk:0所在行的行。但是有时在disk:0version之间也存在供应商名称。当时,这种逻辑失败了。

ver_line_no=$(echo $(( line_no + 6 )))
ver_line_text=`sed -n ${ver_line_no}p $1`
check_if_present=`echo $fver_line_text | grep "version:"`

背景: 我正在尝试解析lshw命令的输出。

*-disk:0
       description: ATA Disk
       product: SAMSUNG 
       physical id: 0
       bus info: scsi@z:y:z:0
       logical name: /dev/sda 
       version: abc
       serial: pqr
       size: 2048GiB 
       capabilities: axy, pqr
       configuration: pqr, abc, ghj
  *-disk:1
       description: ATA Disk
       product: TOSHIBA
       physical id: 0
       bus info: scsi@p:q:z:0
       logical name: /dev/sdb 
       version: nmh
       serial: pqasd
       size: 2048GiB  
       capabilities: axy, pqr
       configuration: pqr, abc, ghj

这是示例信息。 我想使用bash脚本以表格格式打印信息。

5 个答案:

答案 0 :(得分:1)

您应该可以使用sed切出所需的块,然后使用grep

sudo lshw | sed -n '/\*-disk:0/,/\s*\*/p' | grep 'version:'

sed命令不打印任何行(-n),然后查找*-disk:0和下一个*之间的块,并仅打印该行({{1} })。

答案 1 :(得分:1)

sed解决方案:

如果您要搜索给定行号(例如10)之后的第一个匹配项。

l=10
lshw | sed -n "${l},$ {/version/{p;q}}"

如果要搜索给定行内容(例如*-disk:0)之后的第一个匹配项

lshw | sed -n '/*-disk:0/,${/version/{p;q}}'

答案 2 :(得分:0)

您可以使用此owlready2在文件中搜索awk来将标志切换为true:

*-disk:0

awk -F: '$1 ~ /\*-disk$/{p = ($2 == 0)} p && /^[[:blank:]]*version:/' file

答案 3 :(得分:0)

您需要在最后打印所有行。 $代表sed的结尾。

sed -p '6,$p'

将从第6行打印到最后一行。请注意报价,以免$扩展。

您要

ver_line_no=$(( line_no + 6 ))
ver_line_text=$(sed -n "${ver_line_no}"',$p' "$1")
check_if_present=$(echo "$fver_line_text" | grep "version:")

注意:

  • 反引号`已弃用。请改用$( ...)命令替换。
  • 始终引用变量。
  • echo $(( .. ))只是在重复自己。只是$(( ... ))
  • 有时在没有sed的系统上,您可以使用cut -d $'\n' -f6-

答案 4 :(得分:0)

使用awk的常规解决方案(假设每个磁盘都有一个版本)。

文件'find_disk_version.awk'

/disk:/ {
    disk_found="true"
    disk_name=$1
}

/version:/ {
    if (disk_found) {
       print disk_name" "$2
       disk_found=""
   }
}

测试文件“ test”:


Something_else
       version: ver_something_else
       serial: blabla
       configuration: foo, bar
*-disk:0
       description: ATA Disk
       version: ver.0
       serial: pqr
*-disk:1
       version: ver1
       serial: pqasd
       configuration: pqr, abc, ghj
Something_else_again
       version: ver_somethingelse_again
       serial: foobar
       configuration: bar, foo
*-disk:2
       version: ver2
       serial: pqasd
       configuration: pqr, abc, ghj


输出:


$ cat test | awk -f find_disk_version.awk
*-disk:0 ver.0
*-disk:1 ver1
*-disk:2 ver2

您可以使用命令“ lshw”代替“ cat test”

P.S。如果有没有版本的磁盘,脚本将不起作用。