[Python][Bash] : comment piper (combiner) du bash dans du python -c en une ligne ? façon oneliner

Print Friendly, PDF & Email

Peut-être un peu pour la frime et d’autres pour tester certainement. Nombreux sommes nous à vouloir faire un truc bizare en combinant, comme le fait si bien perl, du bash et du python. Mais python n’est pas un animal facile. Vous allez le voir il faut faire preuve d’imagination.

Voici par exemple comment faire un cat et le reprendre dans python pour extraire.

cat /var/log/syslog | python -c "import sys;
import re;
reg=re.compile('(21:.*)');
[ligne for ligne in sys.stdin if sys.stdout.write(reg.search(ligne).group(1))+'\n']"

C’est chaud un peu non ?

Expliquons ce “oneline”, un peu tiré par les cheveux :

  • le cat on revient pas dessus avec un pipe pour passer les données à la commande suivante
  • python -c : -c pour passer des commandes (on est pas dans un fichier de script)
  • import sys : pour le module système
  • import re : pour les regex
  • re.compile pour compiler le pattern de la regex
  • ensuite on récupère ligne par ligne sys.stdin (la sortie stdin correspond au pipe du cat)
  • puis on écrit dans stdout le résultat de la regex (group 1)

On peut faire un peu plus simple par exemple pour reprendre un cat :

ps aux | python -c "import sys; print sys.stdin.read()"

Alors est-ce que vous êtes toujours chaud pour faire du one line avec Python ? un peu moins ? Perso je préfère largement perl pour faire ce genre d’action si nécessaire. Awk est aussi pas mal dans son genre.

## en perl :
cat /var/log/syslog |
perl -nle 'm{(21.*)} and print $1'

## en awk
cat /var/log/syslog |
awk 'match($0, /(21.*)/){print substr($0, RSTART, RLENGTH)}'

Il faut savoir qu’il existe aussi des scripts python qui permettent de simplifier le travail mais bon c’est pas classe intellectuellement lol.

Découvrez  [Bash] : convertir une page man en pdf

et vous vous pratiquez ce genre de commande ? partagez vos oneline