3
votes

comment sélectionner le contenu avec sed dans le shell linux

Dans mon projet, j'ai un fichier linux: audit_check.log

Le contenu de audit_check.log est comme:

2019-01-08 15:09:32,root     pts/0        2019-01-08 11:30 ,root,vm1, 3111  sh keycmd.sh ,/root/USER_CD
2019-01-08 15:09:40,root     pts/0        2019-01-08 11:30 ,root,vm1, 3112  cat /tmp/keycmdtmp.log ,/root/USER_CD
2019-01-08 15:11:39,root     pts/0        2019-01-08 15:09 ,root,vm1, 3120  rm keycmd.sh ,/root/USER_CD

It seems nothing wrong, who can help me?

Maintenant, je veux tout sélectionner lignes dans la même minute.

par exemple, lorsque timeestr est:

timestr=`date +%Y-%m-%d" "%H:%M`

sed -n '/$timestr/p' /var/log/audit_check.log  > /tmp/keycmdtmp.log

le résultat correct devrait être:

timestr=`date +%Y-%m-%d" "%H:%M`

 sed -n '/^$timestr/p' /var/log/audit_check.log  > /tmp/keycmdtmp.log


5 Réponses :


0
votes

Essayez les guillemets doubles:

$ x="$timestr" awk '$0~"^"ENVIRON["x"]' test.log
2019-01-08 15:09:32,root     pts/0        2019-01-08 11:30 ,root,vm1, 3111  sh keycmd.sh ,/root/USER_CD
2019-01-08 15:09:40,root     pts/0        2019-01-08 11:30 ,root,vm1, 3112  cat /tmp/keycmdtmp.log ,/root/USER_CD

Comme ceci:

$ awk -v str="$timestr" '$0~"^"str' test.log
2019-01-08 15:09:32,root     pts/0        2019-01-08 11:30 ,root,vm1, 3111  sh keycmd.sh ,/root/USER_CD
2019-01-08 15:09:40,root     pts/0        2019-01-08 11:30 ,root,vm1, 3112  cat /tmp/keycmdtmp.log ,/root/USER_CD

Par awk , si vous avez déjà $timestr:

$ cat test.log
2019-01-08 15:09:32,root     pts/0        2019-01-08 11:30 ,root,vm1, 3111  sh keycmd.sh ,/root/USER_CD
2019-01-08 15:09:40,root     pts/0        2019-01-08 11:30 ,root,vm1, 3112  cat /tmp/keycmdtmp.log ,/root/USER_CD
2019-01-08 15:10:30,root     pts/0        2019-01-08 11:30 ,root,vm1, 3115  cat /var/log/audit_check.log,/root/USER_CD
2019-01-08 15:10:51,root     pts/0        2019-01-08 11:30 ,root,vm1, 3116  echo yang > xie,/root/USER_CD
2019-01-08 15:10:54,root     pts/0        2019-01-08 11:30 ,root,vm1, 3117  rm -rf xie,/root/USER_CD
2019-01-08 15:10:56,root     pts/0        2019-01-08 11:30 ,root,vm1, 3118  sh keycmd.sh ,/root/USER_CD
2019-01-08 15:11:35,root     pts/0        2019-01-08 11:30 ,root,vm1, 3119  vi keycmd.sh ,/root/USER_CD
2019-01-08 15:11:39,root     pts/0        2019-01-08 11:30 ,root,vm1, 3120  sh keycmd.sh ,/root/USER_CD
2019-01-08 15:11:39,root     pts/0        2019-01-08 15:09 ,root,vm1, 3120  rm keycmd.sh ,/root/USER_CD
2019-01-08 15:12:39,root     pts/0        2019-01-08 11:30 ,root,vm1, 3120  rm keycmd.sh ,/root/USER_CD

$ echo $timestr
2019-01-08 15:09

$ sed -n "/^$timestr/p" test.log
2019-01-08 15:09:32,root     pts/0        2019-01-08 11:30 ,root,vm1, 3111  sh keycmd.sh ,/root/USER_CD
2019-01-08 15:09:40,root     pts/0        2019-01-08 11:30 ,root,vm1, 3112  cat /tmp/keycmdtmp.log ,/root/USER_CD

Juste pour le plaisir, une autre façon d'appeler la variable:

sed -n "/^$timestr/p" file

p>


0 commentaires

5
votes

Ceci est mieux adapté pour awk:

2019-01-08 15:09:32,root     pts/0        2019-01-08 11:30 ,root,vm1, 3111  sh keycmd.sh ,/root/USER_CD
2019-01-08 15:09:40,root     pts/0        2019-01-08 11:30 ,root,vm1, 3112  cat /tmp/keycmdtmp.log ,/root/USER_CD

awk -F, -v dt="$(date '+%Y-%m-%d %H:%M')" '$1 ~ dt' file


0 commentaires

0
votes

En vous basant sur vos journaux, vous pouvez essayer d'ajouter une virgule au sed comme ceci:

sed -n "/${timestr}\,/p" /var/log/audit_check.log  > /tmp/keycmdtmp.log


0 commentaires

2
votes

Vous pouvez simplement utiliser grep si vous avez seulement besoin de filtrer les lignes d'entrée qui correspondent à votre contrainte de temps (pas besoin de choisir awk ou sed code>).

INPUT:

$ grep "^`date '+%Y-%m-%d %H:%M'`" dates_test.in 
2019-01-08 17:20:39,root     pts/0        2019-01-08 15:09 ,root,vm1, 3120  rm keycmd.sh ,/root/USER_CD
2019-01-08 17:20:39,root     pts/0        2019-01-08 11:30 ,root,vm1, 3120  rm keycmd.sh ,/root/USER_CD

grep "^`date '+%Y-%m-%d %H:%M'`" dates_test.in 


0 commentaires

0
votes

Notez que% F représente la date au format ISO (AAAA-MM-JJ), vous pouvez donc l'écrire comme ci-dessous pour la raccourcir davantage.

$ grep "^`date '+%F 15:09'`" dates_test.in
2019-01-08 15:09:32,root     pts/0        2019-01-08 11:30 ,root,vm1, 3111  sh keycmd.sh ,/root/USER_CD
2019-01-08 15:09:40,root     pts/0        2019-01-08 11:30 ,root,vm1, 3112  cat /tmp/keycmdtmp.log ,/root/USER_CD


0 commentaires