如何使用bash脚本在文本文件中的某行后搜索字符串?
例如我想搜索第一次出现的"version:"
字符串,但不是在文件开头,而是在行号。说35,其中包含文本*-disk:0
,这样我将只获得disk-0的产品名称,而没有其他东西。
我当前的方法如下,其中line_no
是行号。 disk:0
所在行的行。但是有时在disk:0
和version
之间也存在供应商名称。当时,这种逻辑失败了。
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脚本以表格格式打印信息。
答案 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。如果有没有版本的磁盘,脚本将不起作用。