Shell Script для извлечения только имени файла - PullRequest
2 голосов
/ 02 февраля 2020

У меня есть такой формат файла (publishfile.txt)

drwxrwx---+  h655201 supergroup          0  2019-04-24  09:16  /data/xyz/invisible/se/raw_data/OMEGA
drwxrwx---+  h655201 supergroup          0  2019-04-24  09:16  /data/xyz/invisible/se/raw_data/sample
drwxrwx---+  h655201 supergroup          0  2019-04-24  09:16  /data/xyz/invisible/se/raw_data/sample(1)

Я просто хочу извлечь имя OMEGA ****, образец, образец (1) Как можно Я делаю это, я использовал basename в своем коде, но он не работает для l oop. Вот мой пример кода

for line in $(cat $BASE_PATH/publishfile.txt)
do 
      FILE_PATH=$(echo "line"| awk '{print  $NF}' )
done
FILE_NAME=($basename  $FILEPATH)

Но этот код также не работает при использовании снаружи для l oop

Ответы [ 3 ]

4 голосов
/ 02 февраля 2020
awk -F / '{ print $NF }' "$BASE_PATH"/publishfile.txt

Это просто говорит о том, что разделитель - это sla sh, и мы хотим, чтобы последнее поле каждой строки.

В принципе, вы никогда не должны запускать Awk для каждой строки ввода в оболочке while read l oop (не говоря уже о a for l oop) ; Awk сам делает это по умолчанию, намного быстрее и лучше, чем оболочка.

1 голос
/ 02 февраля 2020

В вашем коде выше у вас есть опечатка. Ваш код гласит:

    FILE_NAME=($basename  $FILEPATH)

, но он должен читаться как

    FILE_NAME=$(basename  $FILEPATH)

Это должно хорошо работать как внутри, так и за ее пределами oop

0 голосов
/ 02 февраля 2020

Попробуйте:

cat $BASE_PATH/publishfile.txt | awk '{print $7}' | sed 's/.*\///'

будет вывод:

OMEGA
sample
sample(1)

ОБНОВЛЕНИЕ: Я думаю, cat x.txt | sed 's/.*\///' все равно будет работать, если все ваши файлы, папки содержат хотя бы 1 sla sh (/).

Для используемых команд используются следующие руководства: cat , awk , sed

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...