我有一个名为test.txt的文件,其中包含以下内容:
this is the last
char
another last
char
very last
我有一个bash脚本(script.sh),其中包含以下代码:
#!/bin/bash
lastline=0
ctr=0
input="test.txt"
while IFS= read -r line
do
((ctr=ctr+1))
echo "$ctr"
if [ "$line" == "char" ]; then
lastline=$ctr
fi
done < "$input"
echo "$lastline"
我的问题是这些:
当我运行命令bash script.sh
时,我总是获得变量 lastline 的值0 。即使 test.txt 文件上有“字符” ,它似乎也没有通过条件。
似乎while循环不包含最后一行。 但是,当我尝试在 test.txt 文件上放置 5行 回显变量 ctr ,最后打印的数字仅为 4 。
更新
我已经根据RavinderSingh13的答案更新了代码库。我添加了tr -d '\r' < test.txt > temp && mv temp test.txt
这是更新的代码:
#!/bin/bash
tr -d '\r' < test.txt > temp && mv temp test.txt
lastline=1
ctr=1
input="test.txt"
while IFS= read -r line
do
echo "$line"
if [ "$line" == "char" ]; then
lastline=$ctr
fi
((ctr=ctr+1))
done < "$input"
echo "$lastline"
当我运行命令cat -v test.txt
时,我确实在每行末尾看到了一些奇怪的字符( ^ M ),所以我添加了 RavinderSingh13 答案删除它们。但是,它仍然不会检索最后一行。如果有的话,最后一行的字符串是“ char ”,那么结果将是错误的。下图显示了循环在第四行结束。预期的结果应该是1 2 3 4 54。这就是为什么如果在最后一行找到“ char”文本,则结果将是错误的,因为它没有评估最后一行的最后文本。
答案 0 :(得分:0)
如果您同意其他解决方案,则可以尝试以下方法。比shell解决方案更有效。
$(document).trigger($.Event('keydown', {keyCode: 9}));
//
var press = jQuery.Event("keydown");
press.ctrlKey = false;
press.which = 69; press.keyCode = 69;
$(window).trigger(press);
//
var keyEvent = new KeyboardEvent("keydown", {key : "Tab", keyCode:9, shiftKey: true});
document.dispatchEvent(keyEvent);
我也在检查您的代码,并将在几分钟内发布在同一代码上。
在OP的脚本上: :当我测试OP的脚本并在aws Ubuntu机器上运行它时,它可以按以下方式正常运行。
awk '
$0=="char"{
line=FNR
}
END{
print "Last line number having string char is: " line
}
' Input_file
对OP的建议: 尝试检查名为cat file.ksh
#!/bin/bash
lastline=0
ctr=0
input="test.txt"
while IFS= read -r line
do
((ctr=ctr+1))
### echo "$ctr"
if [ "$line" == "char" ]; then
lastline=$ctr
fi
done < "$input"
echo "$lastline"
./file.ksh
4
的Input_file是否具有Control M字符(如果看到),请执行test.txt
然后通过执行cat -v test.txt