Bash 脚本在 file.dev 中查找特定文本并将其分配给变量
Bash script find certain text in a file.dev and assign it to a variable
我有一个 file.dev 包含以下内容:
1 DEVICES {
2 GLOBAL-CONFIG {
3 framerate = "20000";
4 subframes = "0";
5 max_consec_timeouts = "10";
6 max_total_timeouts = "1000";
7 schedmode = "Standard";
8 clustermode = "Standard";
9 }
10 IO-DEVICES {
11 }
12 COMPUTING-DEVICES {
13 RT_WORKSTATION FDT-C-XM-0120 = {
14 hostname = "FDT-C-XM-0120";
15 ipaddress = "fdt-c-XM-0120.fdtel.exter";
16 DISPLAYS {
17 main = "FDT-C-XM-0120:0.0";
18 }
19 SCHEDPARAM {
20 active = "0";
21 framerate = "20000";
22 subframes = "0";
23 max_consec_timeouts = "10";
24 max_total_timeouts = "1000";
25 }
26 }
27
28 RT_HOST fdt-c-agx-0008 = {
29 hostname = "fdt-c-agx-0008";
30 ipaddress = "fdt-c-agx-0008";
31 SCHEDPARAM {
32 active = "0";
33 framerate = "20000";
34 subframes = "0";
35 max_consec_timeouts = "10";
36 max_total_timeouts = "1000";
37 }
38 }
39
40 # RT_HOST fdt-c-agx-0003 = {
41 # hostname = "fdt-c-agx-0003";
42 # ipaddress = "fdt-c-agx-0003.fdtel.exter";
43 # SCHEDPARAM {
44 # active = "0";
45 # framerate = "20000";
46 # subframes = "0";
47 # max_consec_timeouts = "10";
48 # max_total_timeouts = "1000";
49 # }
50 # }
51 }
52 }
此文件位于目录 C:/TechSAT/ADS2/config/file.dev
如您所见,变量 hostname
(line 14, 29 and 41)
有三个条目。
我要做的是编写一个 bash 脚本,它只找到第一个条目 (line 14)
并将其值 FDT-C-XM-0120
保存在一个变量中,例如 $hostnameValue = FDT-C-XM-0120
用于测试目的。
我实际上找到了一个半可行的解决方案,例如:
var=$(grep -r 'hostname' C:/TechSAT/ADS2/config/devices.dev)
但是,这会打印所有匹配项,例如
hostname = "FDT-C-VM-0120";
hostname = "fdt-c-agx-0008";
# hostname = "fdt-c-agx-0003";
在我的例子中,var
必须包含第一个匹配项的值,即 FDT-C-XM-0120
提前致谢
awk 可以为所欲为。
awk -F'"' '/hostname/{print ; exit}' file.txt
输出
FDT-C-XM-0120
使用 GNU grep
和 cut
grep -m1 'hostname' file.txt | cut -d'"' -f2
两种解决方案都使用双引号 " 作为分隔符,awk
-F'"'
和 cut
-d'"'
双引号需要转义,用\
或者用单引号括起来'。所以可以写成-F\"
和-d\"
我有一个 file.dev 包含以下内容:
1 DEVICES {
2 GLOBAL-CONFIG {
3 framerate = "20000";
4 subframes = "0";
5 max_consec_timeouts = "10";
6 max_total_timeouts = "1000";
7 schedmode = "Standard";
8 clustermode = "Standard";
9 }
10 IO-DEVICES {
11 }
12 COMPUTING-DEVICES {
13 RT_WORKSTATION FDT-C-XM-0120 = {
14 hostname = "FDT-C-XM-0120";
15 ipaddress = "fdt-c-XM-0120.fdtel.exter";
16 DISPLAYS {
17 main = "FDT-C-XM-0120:0.0";
18 }
19 SCHEDPARAM {
20 active = "0";
21 framerate = "20000";
22 subframes = "0";
23 max_consec_timeouts = "10";
24 max_total_timeouts = "1000";
25 }
26 }
27
28 RT_HOST fdt-c-agx-0008 = {
29 hostname = "fdt-c-agx-0008";
30 ipaddress = "fdt-c-agx-0008";
31 SCHEDPARAM {
32 active = "0";
33 framerate = "20000";
34 subframes = "0";
35 max_consec_timeouts = "10";
36 max_total_timeouts = "1000";
37 }
38 }
39
40 # RT_HOST fdt-c-agx-0003 = {
41 # hostname = "fdt-c-agx-0003";
42 # ipaddress = "fdt-c-agx-0003.fdtel.exter";
43 # SCHEDPARAM {
44 # active = "0";
45 # framerate = "20000";
46 # subframes = "0";
47 # max_consec_timeouts = "10";
48 # max_total_timeouts = "1000";
49 # }
50 # }
51 }
52 }
此文件位于目录 C:/TechSAT/ADS2/config/file.dev
如您所见,变量 hostname
(line 14, 29 and 41)
有三个条目。
我要做的是编写一个 bash 脚本,它只找到第一个条目 (line 14)
并将其值 FDT-C-XM-0120
保存在一个变量中,例如 $hostnameValue = FDT-C-XM-0120
用于测试目的。
我实际上找到了一个半可行的解决方案,例如:
var=$(grep -r 'hostname' C:/TechSAT/ADS2/config/devices.dev)
但是,这会打印所有匹配项,例如
hostname = "FDT-C-VM-0120";
hostname = "fdt-c-agx-0008";
# hostname = "fdt-c-agx-0003";
在我的例子中,var
必须包含第一个匹配项的值,即 FDT-C-XM-0120
提前致谢
awk 可以为所欲为。
awk -F'"' '/hostname/{print ; exit}' file.txt
输出
FDT-C-XM-0120
使用 GNU grep
和 cut
grep -m1 'hostname' file.txt | cut -d'"' -f2
两种解决方案都使用双引号 " 作为分隔符,awk
-F'"'
和 cut
-d'"'
双引号需要转义,用\
或者用单引号括起来'。所以可以写成-F\"
和-d\"