web-dev-qa-db-fra.com

extraire la sous-chaîne (nom du fichier) avec bash / grep / awk / etc

J'ai une chaîne de processus de sortie de la console comme ceci:

plex     24029 33.3  3.4 330284 63656 ?        Sl   22:37   6:01 /volume1/@appstore/Plex Media Server/Plex Transcoder -codec:0 mpeg2video -codec:1 ac3 -i /volume1/video/classic/Now We've Seen It All!.1976.mkv -filter_complex [0:0]yadif[0];[0]scale=w=768:h=576[1];[1]format=pix_fmts=yuv420p|nv12[2] -filter_complex [0:1] aresample=async=1:ocl='stereo':osr=48000[3] -map [2] -metadata:s:0 language=eng -codec:0 libx264 -crf:0 16 -maxrate:0 7752k -bufsize:0 15504k -r:0 25 -preset:0 veryfast -x264opts:0 subme=1:me_range=4:rc_lookahead=10:me=hex:8x8dct=0:partitions=none -force_key_frames:0 expr:gte(t,0+n_forced*5) -map [3] -metadata:s:1 language=rus -codec:1 aac -b:1 256k -segment_format mpegts -f ssegment -individual_header_trailer 0 -segment_time 5 -segment_start_number 0 -segment_copyts 1 -segment_time_delta 0.0625 -segment_list http://127.0.0.1:32400/video/:/transcode/session/vgh38cdsdmd70euan70xdqh8/cf3a3188-52f9-4b26-8b63-1c348a7c9348/seglist -segment_list_type csv -segment_list_size 2147483647 -segment_list_separate_stream_times 1 -max_delay 5000000 -avoid_negative_ts disabled -map_metadata -1 -map_chapters -1 media-%05d.ts -start_at_zero -copyts -vsync cfr -y -nostats -loglevel quiet -loglevel_plex error -progressurl http://127.0.0.1:32400/video/:/transcode/session/vgh38cdsdmd70euan70xdqh8/cf3a3188-52f9-4b26-8b63-1c348a7c9348/progress

Comment puis-je extraire facilement ce nom de fichier /volume1/video/classic/Now We've Seen It All!.1976.mkv?

Les extensions de chemin et de fichier peuvent être différentes (.avi, .mkv, .mov, .mpeg).

1
Vlad G

Vous pouvez filtrer la chaîne entre “-i” et “-filter_complex” avec:

sed 's/.*-i \(.*\) -filter_complex.*/\1/'

Il enregistre la chaîne entre ces deux groupes en tant que groupe 1 et remplace toute la ligne par celle-ci.

Exemple d'exécution

$ echo "plex     24029 33.3  3.4 330284 63656 ?        Sl   22:37   6:01 /volume1/@appstore/Plex Media Server/Plex Transcoder -codec:0 mpeg2video -codec:1 ac3 -i /volume1/video/classic/Now We've Seen It All"'!'".1976.mkv -filter_complex" | sed 's/.*-i \(.*\) -filter_complex.*/\1/'
/volume1/video/classic/Now We've Seen It All!.1976.mkv
1
dessert

En supposant que les arguments sont toujours dans le même ordre:

grep -oP '(?<=-i ).*?(?= -filter_complex)'

Explication:

  • -o - N'affiche que la partie correspondante de la ligne
  • -P - Utiliser les extensions Perl
  • (?<=-i ) - Recherche de -i
  • .*? - Correspond à zéro ou plusieurs caractères sans avidité
  • (?= -filter_complex) - Lookahead pour -filter_complex
1
wjandrea

Ce n'est pas facile et source d'erreurs sans utiliser un analyseur d'options approprié tel que getopts, mais vous pouvez essayer d'utiliser ack-grep comme ça:

ps ... | ack -o '\-i .+?(\-|$)' | sed 's,^-i ,,' | sed 's,\-$,,'

Vous pouvez également utiliser l'option GNU grep expérimentale -P:

ps ... | grep -oP '\-i .+?(\-|$)' | sed 's,^-i ,,' | sed 's,\-$,,'
0
Arkadiusz Drabczyk