linux bash脚本在首次出现一个字符后剪切字符串

时间:2012-08-17 01:28:39

标签: linux bash

我试图在" screen -list"

中获取所有进程的名称

不幸的是我已经在循环中失败了,因为

for PLINE in `screen -list | grep 'tached)'`; do
    echo "$PLINE"
done

输出

3698.processname
(16/08/12
12:59:37)
(Detached)

但我的预期输出是

    3698.processname    (16/08/12 12:59:37)    (Detached)

就像直接在控制台中键入screen -list | grep 'tached)'一样。

如果此循环已经工作,我试图做的是使用cut -d '.' -f 2然后在找到第一个空格后切断结果字符串。 (我还不太清楚该怎么做,我所知道的只有%' '

所以,我认为很明显我在bash脚本中没有太多线索,因此我可以提供更优雅的建议来做我想做的事情。

(编辑) 解决方案:

for PLINE in `screen -list | grep 'tached)' | awk -F '[ \t\n\v\r.]' '{print $3}'`; do
    echo $PLINE
done

2 个答案:

答案 0 :(得分:0)

$ awk -F '[ \t\n\v\r.]' '{print $2}' <<< $'3698.processname    (16/08/12 12:59:37)    (Detached)'
processname

但是没有必要把grep管道输入awk;只是让awk匹配正则表达式本身。

答案 1 :(得分:0)

如果你想要的只是名字,那就让我们抓住它而不是整条线。

# screen -list
There are screens on:
    85384.ttyv3.filer0  (Attached)
    85617.another   (Detached)
    57491.pts-0.filer0  (Dead ???)
Remove dead screens with 'screen -wipe'.
2 Sockets in /tmp/screens/S-root.

# screen -list | awk '/ched/{split($1,a,".");print a[2]}'
ttyv3 another
#   

你想要一个变量吗?一个for循环?

# read names <<<$(screen -list | awk '/ched/{split($1,a,".");print a[2]}')
# echo $names
ttyv3 another
# for name in $names; do echo "name=$name"; done
name=ttyv3
name=another
#

当然,你可以用纯粹的狂欢来避免大部分噪音:

screen -list | while read name status; do
  if [[ $status =~ ched ]]; then
    echo "${name#*.}"
  fi
done

这可能是您最好的解决方案,因为它不依赖于任何外部工具,如awk或grep。它将更便携,更快速,资源消耗更少。