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 :
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>
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
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
Vous pouvez simplement utiliser INPUT: 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>).
$ 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
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
Citations Citations