J'ai un fichier system.log à ressembler.
[2019-12-20 10:08:04:101,"search":"ea"} [] [] [2019-12-20 10:08:35:101,"search":"ea"} [] []
6 Réponses :
Pourriez-vous essayer de suivre, écrit et testé avec des échantillons montrés dans GNU strong> strong> Ajout d'une explication détaillée pour ci-dessus. P> awk code>.
awk -v s1="\"" ' ##Starting awk program from here and setting s1 as value " here.
/Customer Id:/{ ##Searching string Customer Id: in current line here.
match($0,/\[[0-9]{4}-[0-9]{2}-[0-9]{2}/) ##Using match function of awk and using regex here for current line to get value of date here.
dat=substr($0,RSTART+1,RLENGTH-1) ##Creating dat variable and having sub string value in it for current line.
match($0,/Param: {.*}/) ##Using match to match regex Param: { till } here.
val=substr($0,RSTART,RLENGTH) ##Creating val which has sub string of previous used match function here.
gsub(/.*:"|"}$/,"",val) ##Globally substituting till :" OR "} in last of val here with NULL.
print dat,s1 val s1 ##Printing dat s1 val and s1 here.
dat=val="" ##Nullifying dat and val here to avoid conflict of variable values here.
}
' Input_file ##Mentioning Input_file name here.
Très bien expliqué réponse ++
Vous faites du bon travail pour expliquer vos commandes. Aide beaucoup quand quelqu'un est hors de contact ou nouveau.
Vous pouvez utiliser ce gnu awk code> avec
FPAT code>:
Simplement simple: sortie: p> expliqué: p> si l'antépénultième space séparé String a une sous-chaîne "..."} code>,
Imprimer code> la première chaîne séparée de l'espace à partir du deuxième caractère (à l'exclusion du premier caractère
[ code> ) et la sous-chaîne susmentionnée excluant le dernier caractère
} code>. p> p>
avec sed code>
-n code> désactive l'impression automatique li>
-E code> Activer ERE LI>
^ \ [ code> correspond au démarrage
[ CODE> LI>
([^] +) code> capture la date li>
. * "Recherche": code> correspondance jusqu'à
"Recherche": code> li>
("[^"] + ") code> capture la valeur de la recherche li>
. * code> reste de la ligne li>
\ 1 \ 2 code> Le texte correspondant par les groupes de capture séparés par l'espace li>
p code> Imprimez uniquement si la substitution réussit li>
ul> p>
Il suffit d'utiliser perl code> comme dans https://stackoverflow.com/a/2957781/1921546 A>.
perl -n -e '/^\[([^ ]*).*search":"((?:[^"]|\\.)*)"/ && print "$1 $2\n"'
Je pense que je peux le simplifier à