这是我的示例.txt它包含以下内容的文件
31113 70:54:D2 - a-31003
31114 70:54:D2 - b-31304
31111 4C:72:B9 - c-31303
31112 4C:72:B9 - d-31302
我必须编写 shell 脚本,因为我将前 5 个字符(例如 31113)作为输入 ID 传递给其他脚本。为此,我试过这个
#!/bin/sh
filename='sample.txt'
filelines=`cat $filename`
while read -r line
do
id= cut -c-5 $line
echo $id
#code for passing id to other script file as parameter
done < "$filename"
但它不起作用,这给了我错误
cut: 31113: No such file or directory
cut: 70:54:D2 No such file or directory
31114
31111
31112
: No such file or directory
我该怎么做?
这种方式使用cut
,则需要使用重定向<<<
(此处字符串),如下所示:
var=$(cut -c-5 <<< "$line")
请注意使用 var=$(command)
表达式而不是 id= cut -c-5 $line
。这是将命令保存到变量中的方法。
此外,使用 /bin/bash
而不是 /bin/sh
使其正常工作。
对我有用的完整代码:
#!/bin/bash
filename='sample.txt'
while read -r line
do
id=$(cut -c-5 <<< "$line")
echo $id
#code for passing id to other script file as parameter
done < "$filename"
嗯,这是一个单行cut -c-5 sample.txt
.例:
$ cut -c-5 sample.txt
31113
31114
31111
31112
从那里,您可以将其通过管道传输到任何其他脚本或命令:
$ cut -c-5 sample.txt | while read line; do echo Hello $line; done
Hello 31113
Hello 31114
Hello 31111
Hello 31112
与其将echo
管道输送到cut
,只需将cut
的输出直接传输到 while 循环:
cut -c 1-5 sample.txt |
while read -r id; do
echo $id
#code for passing id to other script file as parameter
done
也许你需要这个,awk可以自动识别空格。
awk '{print $1}' sample.txt
<</div>
div class="one_answers"> 请检查以下简单示例:
while read line; do id=$(echo $line | head -c5); echo $id; done < file
其中head -c5
是从字符串中获取前 5 个字符的正确命令。
尝试从文件中获取第一列,请尝试awk
:
#!/bin/sh
filename='sample.txt'
while read -r line
do
id=$(echo $line | awk '{print $1}')
echo $id
#code for passing id to other script file as parameter
done < "$filename"
比顶级答案简单一些:
#!/bin/bash
filename='sample.txt'
while read -r line; do
id=${line:0:5}
echo $id
#code for passing id to other script file as parameter
done < "$filename"
将 sed
与前 5 个字符匹配并仅返回该组的捕获组一起使用:
sed -E 's/(.{0,5}).*/1/' sample.txt
(.{0,5})
贪婪地匹配任何角色最多 5 次,并创建一个捕获组。
.*
与行的其余部分匹配,因为我们希望替换整行,而不仅仅是捕获组。
1
是一个反向引用,指的是第一个捕获组。
因此,我们正在捕获所需的 5 个字符组,然后仅将该捕获组替换整个匹配行。