2 votes

Supprimer une chaîne spécifique d'un fichier texte en utilisant sed

J'ai un fichier appelé a.txt qui contient,

time="2022-08-02T15:07:53+05:30" level=info msg="\x1b[32m\x1b[1mPUBLIC\x1b[39m\x1b[0m http://some.s3-ap-southeast-2.amazonaws.com/ (\x1b[33mhttp://some.com\x1b[39m)"
time="2022-08-02T15:07:53+05:30" level=info msg="\x1b[31m\x1b[1mFORBIDDEN\x1b[39m\x1b[0m http://some.s3.amazonaws.com (\x1b[33mhttp://some.com\x1b[39m)"
time="2022-08-02T15:07:54+05:30" level=info msg="\x1b[31m\x1b[1mFORBIDDEN\x1b[39m\x1b[0m http://some.s3.amazonaws.com (\x1b[33mhttp://some.com\x1b[39m)"
time="2022-08-02T15:07:58+05:30" level=info msg="\x1b[31m\x1b[1mFORBIDDEN\x1b[39m\x1b[0m http://some-assets.s3.amazonaws.com (\x1b[33mhttp://some.com\x1b[39m)"
time="2022-08-02T15:08:01+05:30" level=info msg="\x1b[31m\x1b[1mFORBIDDEN\x1b[39m\x1b[0m http://some.s3.amazonaws.com (\x1b[33mhttp://some.com\x1b[39m)"

Je veux cet output

PUBLIC    http://some.s3-ap-southeast-2.amazonaws.com
FORBIDDEN http://some.s3.amazonaws.com
FORBIDDEN http://some.s3.amazonaws.com
FORBIDDEN http://some-assets.s3.amazonaws.com
FORBIDDEN http://some.s3.amazonaws.com

J'ai essayé ceci

cat a.txt | cut -d "=" -f4- | cut -d "[" -f3- | cut -d "m" -f2- |  awk -F '\\.amazonaws.com' '{print $1".amazonaws.com"}'

Cela fonctionne, mais je n'arrive pas à supprimer \x1b[39m\x1b[0m

1voto

anubhava Points 172509

Vous pouvez utiliser cette solution awk:

awk -F= '{gsub(/^.*1m|\/? \(.*$|\\x[^[:blank:]]*/, "", $4); print $4}' file | column -t

PUBLIC     http://some.s3-ap-southeast-2.amazonaws.com
FORBIDDEN  http://some.s3.amazonaws.com
FORBIDDEN  http://some.s3.amazonaws.com
FORBIDDEN  http://some-assets.s3.amazonaws.com
FORBIDDEN  http://some.s3.amazonaws.com

Utilisez column -t pour le formatage de la sortie.

1voto

HatLess Points 73

Utilisation de sed

$ sed -E 's~([^[]*\[){2}[^A-Z]*([^\]*)[^ ]* ([^ ]*\.[a-z]+).*~\2 \3~' input_file | column -t
PUBLIC     http://some.s3-ap-southeast-2.amazonaws.com
FORBIDDEN  http://some.s3.amazonaws.com
FORBIDDEN  http://some.s3.amazonaws.com
FORBIDDEN  http://some-assets.s3.amazonaws.com
FORBIDDEN  http://some.s3.amazonaws.com

1voto

RavinderSingh13 Points 29608

Avec vos échantillons affichés, veuillez essayer le code awk suivant, écrit et testé dans GNU awk. Il s'agit d'une combinaison de commande GNU awk + column. Le code utilise la fonction match d'awk pour obtenir la sous-chaîne correspondante selon la sortie requise.

awk '
BEGIN { OFS="\t" }
match($0,/^time=".*level=\S+\smsg="[^[]*\[[^[]*\[1m([^\\]*)\\x1b\S+\s(https?:\/\/\S+)/,arr){
  print arr[1],arr[2]
}
' Input_file | column -t -s $'\t'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X