gpt4 book ai didi

bash - 如何捕获命令的第一列值?

转载 作者:行者123 更新时间:2023-11-29 09:22:59 24 4
gpt4 key购买 nike

我是 shell 脚本的新手。我正在尝试编写一个脚本,假设它运行一个命令并使用 for 循环来捕获输出的第一列并进行进一步处理。

命令:tst 获取文件

这个命令的输出是这样的

NAME        COUNT           ADMIN
FileA.txt 30 adminA
FileB.txt 21 local
FileC.txt 9 local
FileD.txt 90 adminA

这是我到目前为止尝试过的:UPDATED 还想运行其他命令

#!/bin/bash

for f in $(tst get files)
do
echo "FILE :[${f}]"
tst setprimary ${f} && tst get dataload
done

我看到的输出是这样的

FILE :[NAME]
FILE :[COUNT]
FILE :[ADMIN]
FILE :[FileA.txt]
FILE :[30]
FILE :[adminA]
FILE :[FileB.txt]
FILE :[21]
FILE :[local]
FILE :[FileC.txt]
FILE :[9]
FILE :[local]
FILE :[FileD.txt]
FILE :[90]
FILE :[adminA]

我正在寻找类似的输出

FILE :[FileA.txt]
FILE :[FileB.txt]
FILE :[FileC.txt]
FILE :[FileD.txt]

我应该在 shell 脚本中修改什么以仅捕获 NAME 列值?我是否在 for 循环中正确执行了 tst get files 命令,或者是否有更好的方法来执行命令并循环遍历结果?

最佳答案

编辑(Samuel Kirschner):您可以完全不使用 for 循环,只需使用 awk 打印您感兴趣的行

tst get files | awk 'NR > 1 {print "FILE :[" $1 "]"}'

如果您出于某种原因想要保留 for 循环,并且只是在跳过标题的同时从行中提取文件名,您有几个选择。 Awk 可能是最简单的,因为 NR 内置变量(计算行数)和自动字段拆分(例如,$1 指的是行中的第一个字段),但您也可以使用 sedcut

您可以使用 awk 'NR > 1 {print $1}' 获取第一列(在跳过第一行时使用任何空白字符作为分隔符)或 sed 1d |剪切 -d$'\t' -f1。请注意,$'\t' 是 bash 特定于文字制表符的语法,如果您的文件用空格填充而不是使用制表符来分隔字段,则不能使用 sed ... |剪切 ... 示例。

#!/bin/bash

for f in $(tst get files | awk 'NR > 1 {print $1}')
do
echo "FILE :[${f}]"
done

#!/bin/bash

for f in $(tst get files | sed 1d | cut -d$'\t' -f1)
do
echo "FILE :[${f}]"
done

避免在 for 循环中进行不必要的拆分。最好将 IFS 设置为循环体外部的特定内容,以防止'a file with whitespace.txt' 被分解。

OLD_IFS=IFS
IFS=$'\n\t'

for f in $(tst get files | sed 1d | cut -d$'\t' -f1)
do
echo "FILE :[${f}]"
done

关于bash - 如何捕获命令的第一列值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42793607/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com