shell脚本:从文件

时间:2016-02-25 21:11:38

标签: bash shell sh

我有一个名为sample.txt的文件,文件中的值是这样的:

编者注:样本行最初在它们之间有空行,但OP已确认这是偶然的。

100
200
300
hiiiii

最后一个值可以是字符串或除数字之外的任何内容....

如何使用unix脚本从文件中获取最后一个整数值。我期待的输出是300 ..

我尝试了以下命令,但我只从 hiiiii 获取

value=`cat $working_tmp_dir/sample.txt|tail -3| head -1|cut -f2 -d'='|cut -b 1-8`

7 个答案:

答案 0 :(得分:2)

grep  -Eo '^[0-9]+$' hi.txt | tail -1

其中hi.txt是您的文件

答案 1 :(得分:2)

awk也适用于此:

awk  '{ if ($1 ~ /^[0-9]+$/) lastnumber=$1 } END {print lastnumber}' <yourfile.txt>

awk将遍历您文件中的每一行,并通过此处单引号内的脚本运行它。

脚本,用外行人的术语说&#34;测试该行的第一个字段($ 1)以查看它是否与此正则表达式匹配,该正则表达式正在查找仅为数字的字符串。如果找到匹配项,则将该匹配项存储在变量lastnumber中。当awk向下移动文件时,它会在第一个字段中找到完全数字字符串时更改lastnumber。完成(END)处理文件后,它会打印存储在lastnumber变量中的值。

话虽如此,如果您的系统支持tac,我会推荐@ karakfa的答案,因为这对于较大的文件会更有效。

我还强烈建议阅读@ mklement0的优秀答案,因为它使用相同的逻辑,但适用于整个文件行,并且是一个更简洁的脚本。他们的解释也非常好。

答案 2 :(得分:2)

另一种选择

$ tac file | awk '/^[0-9]+$/{print;exit}'

300

反转文件,打印第一个数字。

答案 3 :(得分:1)

你可以使用带有grep(PCRE)的 GNU -P命令和-z选项一次读取整个文件:

grep -oPz '\d+(?=\D*\z)' file

300

答案 4 :(得分:1)

假设你的整数:

  • 从第一行开始
  • 都在一个连续的行块中

您可以使用这种高效的单命令解决方案(符合POSIX):

awk '/^[0-9]+$/ { n=$0; next } { print n; exit }' sample.txt

注意:尽管karakfa's answer涉及一个额外的实用程序tac,但对于最后一个数字接近文件末尾的大文件,他的答案可能会更快。

  • /^[0-9]+$/仅匹配由十进制数字组成的行,即十进制数字(可能带有前导零)。
  • { n=$0; next }将该行($0)保存在变量n中并开始处理下一行(next;跳过脚本中的其余命令)。
  • 因此,
  • { print n; exit }首先执行 not 仅包含十进制数字的第一行; n,其中包含遇到的 last 十进制数,并且exit完全终止处理。

答案 5 :(得分:0)

这将匹配文件中的数字并打印最后一个。

grep -o "[0-9]*" sample.txt | tail -n 1

答案 6 :(得分:0)

另一种选择

grep -x '[0-9 ]*' hi.txt | tail -1

(我决定也允许空格)