如何在bash的每一行中得到最后一个单词
例如,我有一个文件:
$ cat file i am the first example. i am the second line. i do a question about a file. 
我需要:
 example, line, file 
我意图与“awk”,但问题是,这些词是在不同的空间
尝试
 $ awk 'NF>1{print $NF}' file example. line. file. 
要像在你的例子中一样得到结果,请尝试:
 { sub(/\./, ",", $NF) str = str$NF } END { print str } 
输出:
 $ awk -f script.awk file example, line, file, 
纯粹的bash:
 $ while read line; do [ -z "$line" ] && continue ;echo ${line##* }; done < file example. line. file. 
你可以用grep轻松做到这一点:
 grep -oE '[^ ]+$' file 
  ( -E使用扩展正则expression式; -o只输出匹配的文本而不是整行) 
你可以在awk中做这样的事情:
 awk '{ print $NF }' 
编辑:避免空行:
 awk 'NF{ print $NF }' 
 在纯bash中这样做的另一种方法是使用rev命令,如下所示: 
 cat file | rev | cut -d" " -f1 | rev | tr -d "." | tr "\n" "," 
 基本上,你反转文件的行,然后用空格作为分隔符分割它们,把第一个cut产生的字段再次反转,使用tr -d删除不需要的字符并再次replace换行符chars与, 
另外,你可以通过这样做来避免第一只猫:
 rev < file | cut -d" " -f1 | rev | tr -d "." | tr "\n" "," 
 有很多方法。 正如awk解决scheme所显示的,这是一个干净的解决scheme 
sed解决scheme是删除任何东西,直到最后一个空格。 所以如果最后没有空间的话,它应该可以工作
 sed 's/.* //g' <file> 
 你也可以避免sed并去一段while循环。 
 while read line do [ -z "$line" ] && continue ; echo $line|rev|cut -f1 -d' '|rev done < file 
它读取一条线,尊敬它,削减第一(即在原来的最后)并恢复
同样可以用纯粹的bash方式来完成
 while read line do [ -z "$line" ] && continue ; echo ${line##* } done < file 
它被称为参数扩展
tldr;
 $ awk '{print $NF}' file.txt | paste -sd, | sed 's/,/, /g' 
对于这样的文件
 $ cat file.txt The quick brown fox jumps over the lazy dog. 
给定的命令将打印
 fox, over, dog. 
怎么运行的:
-   
awk '{print $NF}':打印每一行的最后一个字段 -   
paste -sd,连续读取stdin(-s,一次一个文件)并写入字段逗号分隔(-d,) -   
sed 's/,/, /g':substitutes","with", "globally(for all instances) 
参考文献: