如何使用'cut'找到最后一个字段

时间:2014-03-29 04:43:37

标签: linux bash cut

没有使用sedawk cut,如何在字段数量时获取最后一个字段是不知道的或每一行都有变化?

12 个答案:

答案 0 :(得分:506)

您可以尝试这样的事情:

echo 'maps.google.com' | rev | cut -d'.' -f 1 | rev

<强>解释

  • maps.google.com的反面将是moc.elgoog.spam
  • cut使用点作为分隔符并选择第一个字段,即moc
  • 最后,我们再次将其反转(感谢提醒,@ tom)获取com

答案 1 :(得分:103)

使用参数扩展。这比任何类型的外部命令cut(或grep)都要高效得多。

data=foo,bar,baz,qux
last=${data##*,}

有关bash中本机字符串操作的介绍,请参阅BashFAQ #100

答案 2 :(得分:74)

仅使用cut是不可能的。以下是使用grep

的方法
grep -o '[^,]*$'

替换其他分隔符的逗号。

答案 3 :(得分:24)

没有awk?... 但是用awk这么简单:

echo 'maps.google.com' | awk -F. '{print $NF}'

AWK是一种更强大的工具,可放在口袋里。 -F如果是字段分隔符 NF是字段数(也代表最后一个的索引)

答案 4 :(得分:13)

有多种方法。你也可以使用它。

echo "Your string here"| tr ' ' '\n' | tail -n1
> here

显然,tr命令的空格输入应该用你需要的分隔符替换。

答案 5 :(得分:7)

除了剪切之外,这是唯一可以使用的解决方案:

  回声“s.t.r.i.n.g.” |切-d'。' -f2-    [repeat_following_part_forever_or_until_out_of_memory:] |切-d'。' -f2 -

使用此解决方案,字段数确实可以是未知的,并且会不时变化。但是,由于行长度不得超过LINE_MAX字符或字段(包括换行符),因此任意数量的字段永远不能成为此解决方案的真实条件。

是的,这是一个非常愚蠢的解决方案,但是我认为唯一符合标准的解决方案。

答案 6 :(得分:2)

以下实现A friend's suggestion

#!/bin/bash
rcut(){

  nu="$( echo $1 | cut -d"$DELIM" -f 2-  )"
  if [ "$nu" != "$1" ]
  then
    rcut "$nu"
  else
    echo "$nu"
  fi
}

$ export DELIM=.
$ rcut a.b.c.d
d

答案 7 :(得分:2)

使用 perl 的替代方法是:

perl -pe 's/(.*) (.*)$/$2/' file

您可以更改 \t 的位置,无论 file 的分隔符是什么

答案 8 :(得分:0)

如果您有一个名为filelist.txt的文件,它是一个列表路径,如下所示: C:/dir1/dir2/file1.h C:/dir1/dir2/dir3/file2.h

然后你可以这样做: rev filelist.txt | cut -d“/” - f1 |转

答案 9 :(得分:0)

如果您的输入字符串不包含正斜杠,则可以使用basename和一个子shell:

$ basename "$(echo 'maps.google.com' | tr '.' '/')"

这不使用sedawk,但也没有使用cut,因此我不确定它是否可以作为问题的答案它的措辞。

如果处理可能包含正斜杠的输入字符串,此方法将无法正常工作。解决该问题的方法是将正斜杠替换为您知道不是有效输入字符串的一部分的其他字符。例如,文件名中也不允许使用竖线(|),因此可以使用:

$ basename "$(echo 'maps.google.com/some/url/things' | tr '/' '|' | tr '.' '/')" | tr '|' '/'

答案 10 :(得分:0)

为这个老问题添加一种方法只是为了好玩:

$ cat input.file # file containing input that needs to be processed
a;b;c;d;e
1;2;3;4;5
no delimiter here
124;adsf;15454
foo;bar;is;null;info

$ cat tmp.sh # showing off the script to do the job
#!/bin/bash
delim=';'
while read -r line; do  
    while [[ "$line" =~ "$delim" ]]; do
        line=$(cut -d"$delim" -f 2- <<<"$line")
    done
    echo "$line"
done < input.file

$ ./tmp.sh # output of above script/processed input file
e
5
no delimiter here
15454
info

除bash外,仅使用cut。 好吧,我想是回声。

答案 11 :(得分:-1)

我意识到如果我们只确保存在一个尾随分隔符,它就可以了。所以在我的情况下,我有逗号和空格分隔符。我在最后加了一个空格;

$ ans="a, b"
$ ans+=" "; echo ${ans} | tr ',' ' ' | tr -s ' ' | cut -d' ' -f2
b