在shell变量中提取文件的最后一个和第二个最后一个字符串

时间:2011-11-02 17:38:53

标签: linux bash shell sed awk

虽然它看起来与我以前的帖子类似,但目的不同。

udit@udit-Dabba ~/ah $ cat decrypt.txt
60 00 00 00 00 17 3a 20  00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 01  00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 02  *00 00 e0 f9 6a 61 61 6e
65 6b 61 68 61 6e 67 61  79 65 77 6f 64 69 6e* 00
00 00 03 29 

我想在shell变量中提取文件的最后一个字符串(这里是29

我试过了......

size=`wc -w encrypt.txt`

awk -v size=$size 'BEGIN {RS=" ";ORS=" ";}' {if (NR>size-1 &&
                                         NR < size+1)print $0}' decrypt.txt

输出      29

但是当我稍微更改文件时..

  udit@udit-Dabba ~/ah $ cat decrypt.txt
  60 00 00 00 00 17 3a 20  00 00 00 00 00 00 00 00
  00 00 00 00 00 00 00 01  00 00 00 00 00 00 00 00
  00 00 00 00 00 00 00 02  *00 00 e0 f9 6a 61 61 6e
  65 6b 61 68 61 6e 67 61  79 65 77 6f 64 69 6e* 00
  65 6b 61 68 61 6e 67 61  00 00 03 29 

输出       03

为什么结果之间存在差异?

我是awk和shell功能的新手,所以我不确定这是否是正确的方法???

我认为grep,sed,awk或任何其他linux命令应该有一些变化可以解决我的问题,但我不知道。

请指导我。

提前完成。

目的:

在shell脚本中创建两个变量,它应该存储输入文件的最后和第二个字符串。

限制:

每个输入文件在文件末尾都包含一个空行。

(就像在上面提到的文件中一样,在文件内容之后会有一个空白行,就像点击ENTER键一样,并且无法更改,因为它是在运行时通过C程序生成的。)

6 个答案:

答案 0 :(得分:2)

grep -v "^$" file | tr " " "\n" | tail -n 2

也许grep - 部分并不完美,也许应该改变。

修改

tr -s " " "\n" < file | tail -n 2

是更好的解决方案 - 请参阅Gordon Davisson的评论。

答案 1 :(得分:1)

获取最后一个字段:

awk '{ if (NF > 0) { last = $NF } } END { print last }' "$@"

对于最后一行只有一个字段的情况,第二个字段比较复杂(所以你需要前一行的最后一个字段)。

awk '{ if (NF > 0)
       {
           if (NF == 1) { lastbut1 = last; last = $1; }
           else { lastbut1 = $(NF-1); last = $NF; }
       }
     }
     END { print lastbut1 " " last; }' "$@"

如果文件只包含一个值,则会产生空白和最后一个值。如果根本没有值,它只会产生空白。

答案 2 :(得分:1)

如果您认为记录分隔符是空格或换行符,那么您只需要保留最后2条记录。

awk -v 'RS=[ \n]+' '{prev2 = prev1; prev1 = $0} END {print prev2, prev1}' filename

答案 3 :(得分:0)

FIRST="$(head -n 1 file)"
LAST="$(tail -n 1 file)"
LASTBUTONE="$(tail -n 2 file | head -n 1)"

当然,您可以通过多种方式切断最后一个字段:

echo "$ONEOFTHOSE" | gawk '{print $(NF)}'
echo "$ONEOFTHOSE" | sed -e 's/^.*[[:space:]]//'

答案 4 :(得分:0)

这是一个tr / sed解决方案:

answers=$(tr -d '\n' <input_file | sed -r 's/.*(\S\S)\s*(\S\S)\s*$/\1 \2/')
echo "Last = ${answers#???} Penultimate = ${answers%???}"

仅限Sed:

answers=$(sed -r '1{h;d};H;${x;y/\n/ /;s/.*(\S\S)\s*(\S\S)\s*$/\1 \2/p};d' input_file)
echo "Last = ${answers#???} Penultimate = ${answers%???}"

答案 5 :(得分:0)

如果您安装了'rev'实用程序,则可以使用它。假设空间是分隔符。

rev <file>|cut -f1,2|rev