linux 仅从文件中提取主机名

c9qzyr3d  于 2023-03-29  发布在  Linux
关注(0)|答案(5)|浏览(180)

我试图只提取主机名和该主机名中的命令状态,但找不到有用的grep选项来执行此操作。

server1

bash: adinfo: command not found

我尝试使用grep/sed,它只提供主机名和adinfo命令的命令输出。

more file3 |grep 'com.*nd'

bash: adinfo: command not found
bash: adinfo: command not found

所以我得到了部分输出,但没有上面列出的服务器名称。理想情况下,它应该列出服务器名称和那个命令输出。
任何帮助都很感激。

more file3 |grep 'com.*nd'

为了澄清,我有一个包含以下内容的大文件:

server1

Local host name:   server1
Joined to domain:  domain.com
Joined as:         server1.domain.com
Pre-win2K name:    server1
Current DC:        domain.com
Preferred site:    Datacenter
Zone:              servers Zone
Last password set: 2022-03-11 02:23:55 EST
CentrifyDC mode:   connected
Licensed Features: Enabled

server2

bash: adinfo: command not found

我只想看到'adinfo'命令不能运行的地方,沿着服务器名称。我可以缩小到

# more file3 |grep -e 'Loc.*me' -e 'Cen.*de'
Local host name:   server1
CentrifyDC mode:   connected

但不是相反,我只能看到adinfo不工作的服务器。

iyr7buue

iyr7buue1#

使用greppaste如下:

grep -P '\S' infile | grep -P -B1 '^bash: adinfo' | paste - - > outfile

grep -P '\S' infile:选择输入文件中的非空文件。
grep -P -B1 '^bash: adinfo':选择以bash: adinfo开头的行。
paste - -:将每两行合并为一行。

gorkyyrv

gorkyyrv2#

awk -F': *' '
    NF==1{
        server = $1
    }
    /^Local host name/ || /^CentrifyDC mode:/ {
        a[i+=1] = $2
    }
    i==2{
        printf "%s - hostname: %s, mode: %s\n", server, a[1], a[2]
        i=0
    }
    /^bash: adinfo:/{
        printf "%s - %s \n", server, $0
    }
' file

server1 - hostname: server1, mode: connected
server2 - bash: adinfo: command not found
2o7dmzc5

2o7dmzc53#

既然你说“我只想看看'adinfo'命令不能运行的地方,沿着服务器名称”-使用任何awk:

$ awk '/bash: adinfo:/{print prev ORS $0} NF{prev=$0}' file
server2
bash: adinfo: command not found
jobtbby3

jobtbby34#

这应该做到:

awk 'NF==1 {f=$1} /adinfo/ {print f,$0}' file
server2 bash: adinfo: command not found

NF==1 f=$1}如果行上有一个文件,则假定它是服务器名称并将其保存在变量f
/adinfo/ {print f,$0}如果行包含adinfo,则打印变量f中的服务器名称和adinfo信息

ivqmmu1c

ivqmmu1c5#

GNU sed解决方案,让file.txt内容

server1

Local host name:   server1
Joined to domain:  domain.com
Joined as:         server1.domain.com
Pre-win2K name:    server1
Current DC:        domain.com
Preferred site:    Datacenter
Zone:              servers Zone
Last password set: 2022-03-11 02:23:55 EST
CentrifyDC mode:   connected
Licensed Features: Enabled

server2

bash: adinfo: command not found

然后

sed -n '/adinfo/{G;p};/./h' file.txt

给出输出

bash: adinfo: command not found 
server2

说明:-n关闭默认打印,对于包含adinfo的行,追加换行符并保留内容(G),然后打印(p),对于至少包含1个字符的行,将内容放入保留空间(.)。观察名称确实出现在 * 命令结果之后。

  • (在GNU sed 4.7中测试)*

相关问题