Как я могу получить два столбца вывода ls в сценарии удара

Вы могли бы использовать SED , как это:

    sed 'h;s/,[^|]*//g;x
    /,/{s/|[^,|]*,*/|-/g;H;}
    x;s/-\([^|]\)/\1/g;P;D'

Это ранило относительно проще в конце концов. Применяя этот маленький скрипт к вашим данным:

key1|0|11881|0|0|0|0|11769|0|0|0
key2|2027|345|0|1|0|2040|364|0|1|0
key2|-|712|-|-|-|-|729|-|-|-
key3|0|670944|0|0|0|0|495554|0|0|0
key4|1847|1|0|0|0|1814|1|0|0|0
key4|-|21|-|-|-|-|22|-|-|-
key5|1880|11|0|154|0|1886|11|0|151|0
key5|-|402|-|-|-|-|397|-|-|-
key6|1|65|0|8|0|16684|51|0|8|0
key6|1|4570|-|-|-|0|4176|-|-|-
key6|19137|-|-|-|-|-|-|-|-|-
key7|1851|11|0|202|0|1856|13|0|193|0
key7|-|757|-|-|-|-|751|-|-|-

в основном SED просто решает каждое поле с обоих концов. Сначала он сохраняет копию своей текущей итерации в H старого пространства. Затем SED удаляет все, от каждого поля после первой запятой. После этого SED выключается обратно к сохраненной копии, поэтому он может удалить поле, которое он просто сохранен в другом буфере.

Если запятыми остаются, добавляет вторую копию к первому следующему вставленным \ N символ EWLINE, так что он может резать как минимум еще раз, когда P; D P Rint Затем D D Elete только до первого происхождения \ N символ EWLine в области шаблона, прежде чем начать с тем, что остается.

-121--105607-

ZSH - это гораздо более элегантное решение , но если это не ваша оболочка, вы можете использовать awk :

 printf "%s\n" "$path"
/home/user/working-root-directory/band-folder/album-name/music-file.mp3

band=$(awk -F/ '{print $(NF-2)}' <(printf "%s" "$path"))
printf "%s\n" "$band"
band-folder

album=$(awk -F/ '{print $(NF-1)}' <(printf "%s" "$path"))
printf "%s\n" "$album"
album-name

file=$(awk -F/ '{print $NF}' <(printf "%s" "$path"))
printf "%s\n" "$file"
music-file.mp3

0
03.12.2014, 04:25
2 ответа

Ты не хочешь делать это на вечеринке, но потому что ты спросил, вот как ты можешь разделить это.

#!/bin/bash
re='^[0-9]+$'
for x in `/usr/bin/ls -l --time-style=+'%s' /var/indexes | sort -k3,3 | awk '{print $3 $7}'`
do
read -A nm <<< "$x"
if [[ ${nm[0]} =~ $re ]] ; then
   echo "found one " ${nm[1]}
fi
done

В awk проще так:

/usr/bin/ls -l --time-style=+'%s' /var/indexes | sort -k3,3 | awk '($3 ~ /^[0-9]+$/){print $7}'

На самом деле, правильным решением будет найти ж/ -ногруппу, как предложил Пол Х...

1
28.01.2020, 02:20

Не проще ли найти с флагом -nogroup? Например:

find /var/indexes -nogroup

Если вы хотите основывать скрипт вокруг ls, то awk - это инструмент, который я бы использовал для выбора столбцов.

3
28.01.2020, 02:20

Теги

Похожие вопросы