我有一个脚本(myscript.sh)循环,它grep
在许多不同的文件中存储一些字符串,将它们存储在一个新文件中,然后cat
将该文件的内容存储到终端:
for i in {1..201..5}; do
grep "Pitch" filename-$i.log | cut -d" " -f25
done > pitch.txt
echo "========Pitch==========="
cat pitch.txt
这是我想从命令行执行的操作:
./myscript.sh filename-$i.log
然后运行 myscript.sh,循环遍历i
我在 myscript.sh 的参数中引用的变量。
我希望我已经正确解释了我的目标!
答案1
如果您想将不同文件名的基本部分作为第一个参数传递给脚本,请将循环更改为:
for i in {1..201..5}; do
grep "Pitch" "${1}-${i}" | cut -d" " -f25
done > pitch.txt
(假设破折号始终存在,并且不作为参数的一部分传递,并且文件名的可变部分始终位于末尾)
答案2
目前尚不清楚您想要什么,但从我得到的情况来看,您有 6 个目录,但每个目录都有以类似方式命名的文件,末尾带有数字。然后你可以这样做:
for arg
do
for i in {1..201..5}; do
grep "Pitch" "$arg-$i" | cut -d" " -f25
done > $arg/pitch.txt
echo "========Pitch==========="
cat $arg/pitch.txt
done
答案3
使用这个语法:
for ((i=0; i<=$1; i=(($i + 5)) ))
grep "Pitch" filename-$i | cut -d" " -f25
done > pitch.txt
echo "========Pitch==========="
cat pitch.txt
答案4
这个bash
函数应该可以工作:
foo() {
searchstring="$1"
shift 1
echo "========${searchstring}===========" ;
grep --no-filename "${searchstring}" "$@" | \
cut -d" " -f25 | tee "${searchstring,,}".txt
}
像这样调用:
foo Pitch filename-{1..201..5}
怎么运行的。由于grep
允许从命令行使用多个文件名,并且bash
允许在诸如 之类的代码中添加字符串前缀{1..10}
,因此无需通过for
循环一次传递一个文件名。和cat
都>
可以替换为单个tee
。
第一个参数foo
是搜索字符串(例如“匹配"),shell 将其设置为 "1 美元“ - 被移动到临时变量$searchstring
,然后”匹配“ 被删除shift 1
,因此 ”$@" 仅包含文件名。