linux - 如何在 Linux 中获取文件的最后一行前 2 个字符

标签 linux bash shell awk sed

我有包含以下格式的文件,由另一个系统生成

 12;453453;TBS;OPPS;
 12;453454;TGS;OPPS;
 12;453455;TGS;OPPS;
 12;453456;TGS;OPPS;
 20;787899;THS;CLST;
 33;786789;

我必须检查最后一行是否包含 33 ,然后必须继续将文件复制到其他位置。否则丢弃该文件。

目前我正在做如下

tail -1 abc.txt >> c.txt
awk '{print substr($0,0,2)}' c.txt

然后如果 o/p 被保存到另一个变量并复制。 任何人都可以建议任何其他简单的方法。

谢谢!

R/

最佳答案

假设您有以下输入文件:

$ cat file
a
b
c
d
e
agc

然后您可以运行以下命令(grepawksedcut)来获取最后一行的前 2 个字符:

AWK

$ awk 'END{print substr($0,0,2)}' file
ag

SED

$ sed -n '$s/^\(..\).*/\1/p' file                             
ag

GREP

$ tail -1 file | grep -oE '^..' 
ag

剪切

$ tail -1 file | cut -c '1-2' 
ag

BASH 子字符串

line=$(tail -1 file); echo ${line:0:2}

所有这些命令都可以满足您的需求,awk 命令只会在文件的最后一行执行操作,因此您不再需要 tail ,该命令将提取文件的最后一行并将其存储在其模式缓冲区中,然后将不是前 2 个字符的所有内容替换为空,然后打印模式缓冲区(最后一行的第 2 个字符),另一个解决方案只是 tail 文件的最后一行并使用 grep 提取前 2 个字符,通过管道传递这 2 个命令,您也可以在不使用的情况下一步完成中间变量、文件。

现在如果你想把所有东西都放在一个脚本中,这就变成了:

$ more file check_2chars.sh 
::::::::::::::
file
::::::::::::::
a
b
c
d
e
33abc
::::::::::::::
check_2chars.sh
::::::::::::::
#!/bin/bash
s1=$(tail -1 file | cut -c 1-2) #you can use other commands from this post
s2=33

if [ "$s1" == "$s2" ] 
then
   echo "match" #implement the copy/discard logic
fi

执行:

$ ./check_2chars.sh
match

我会让你实现复制/丢弃逻辑

证明:

enter image description here

关于linux - 如何在 Linux 中获取文件的最后一行前 2 个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49228708/

相关文章:

regex - 如何使用 bash 将每一行提取到不同的变量中

bash - 忽略 bash 中的退出代码

javascript - 将二进制文件内容转储到 JSON 数组中

linux - 如何在 Linux Shell 脚本文件中包含文件?

linux - 如何在 Dockerfile 中运行 sudo su -

c - C (linux) 中的线程

shell - 递归检查具有可执行位设置的文件

linux - 如何更改 Linux 系统帐户或未登录 shell 的用户的限制

c++ - 使用 boost 的 C++ 中的 hello world python 扩展?

linux - 将自定义 Hook 添加到使用 Docker 安装的 Gitlab