从ls -l的每行输出中获取列数据

时间:2012-03-25 17:52:25

标签: bash multidimensional-array

我有一个脚本可以识别内存中的Flash文件,以便复制或传递给vlc等程序进行播放。

#!/bin/bash
pid=($(ps aux | grep flash | grep -v grep | grep -v bin/flash))
cd "/proc/${pid[1]}/fd"
file=($(echo `ls -l  | grep /tmp/`))
file="${file[8]}"
echo "$file"

这很好但我希望它返回每个匹配的文件,因为它只返回第一个。

我通常会做类似多维数组的事情,但bash没有那些,即使它确实如此,我也不会知道语法。

如何逐行拆分输出,然后回显每个的[8]值?

2 个答案:

答案 0 :(得分:0)

您可以使用awk

files=$(ls -l|awk -F"-> " '/\/tmp/{print $2}')

这根本不是故障保护(解析ls的输出通常不是)。

如果find支持,则更安全的方法是:

files=$(find . -type l -printf "%l\n")

(如果文件名中有空格,则仍然不安全。)

这应该非常强大,并为您提供bash array来启动:

IFS=$'\n' files=($(find . -type l -printf "%l\n"|grep /tmp))

(仍然无法使用包含\n的文件名。)

答案 1 :(得分:0)

这也处理来自ps的多行输出。也许你可以拥有多个Flash流程?

#!/bin/sh
for pid in $(ps aux | awk '/[f]lash/ && !/bin\/[f]lash/{print $1}); do
    for file in /proc/$pid/fd/*; do
        case $(readlink "$file") in
            /tmp/*) echo "$file" ;;
         esac
    done
done