Cara menambahkan Beberapa Penelusuran dalam perintah AWK

10

Saya mencoba mencari file yang Dibuat pada bulan Juni, Juli dan Agustus. Saya menggunakan metode ini

ls -lrth|awk '/[Jun][Jul][Aug]/ {print}'

tapi itu tidak berhasil.

OmiPenguin
sumber
1
Sebagai catatan, [...]konstruk tersebut cocok dengan satu karakter, yang dapat berupa salah satu karakter di antara tanda kurung. Jadi ekspresi Anda cocok JJA atau Jug( Jdari [Jun], udari [Jul], dan gdari [Aug]) tetapi bukan singkatan bulan yang Anda harapkan cocok.
tripleee

Jawaban:

12

Anda dapat mencocokkan pada beberapa pola seperti:

awk '/Jun/ || /July/ || /Aug/' <(ls -lrh)

Ini mengembalikan semua kecocokan untuk Juni, Juli, atau Agustus. Anda tidak memerlukan printpernyataan karena itu adalah awktindakan default.

jasonwryan
sumber
1
awk mengerti regexps yang diperluas, jadi untuk pola sesederhana itu Anda bisa menuliskannya sebagai awk '/Jun|Jul|Aug/'atauawk '/Ju[nl]|Aug/'
cas
5

Sebagai aturan umum, itu adalah ide yang sangat buruk untuk mem-parsing output dari ls . Cara yang lebih baik untuk melakukan apa yang Anda inginkan adalah

stat -c "%n %y" * | grep 2013-0[678]

Atau, periksa hanya bidang terakhir untuk melindungi dari kasus yang tidak terduga di mana nama file itu sendiri adalah tanggal:

stat -c "%n %y" *| awk '$NF ~ /2013-0[678]/' 

Dari man stat:

   -c  --format=FORMAT
          use the specified FORMAT instead of the default; output  a  new
          line after each use of FORMAT

   %y     time of last modification, human-readable
   %n     file name
terdon
sumber
Ini juga contoh yang bagus. Saya tidak pernah memeriksa STAT sebelumnya. terima kasih atas info
hebatnya
Mungkin berubah untuk ... | awk '$NF ~ /2013-0[678]/'hanya memeriksa output field terakhir, di (mungkin?) Bahkan bahwa file nama sesuai dengan regex bahkan ketika tanggal tidak.
tripleee
3

lsadalah perintah untuk menampilkan informasi tentang file yang dapat dibaca manusia. Jangan menggunakannya dalam skrip .

Perintah untuk menemukan file di pohon direktori yang cocok dengan kriteria tertentu adalah find. Jika Anda memiliki GNU find (yaitu Linux atau Cygwin yang tidak tertanam) atau FreeBSD find (yaitu FreeBSD atau OSX), Anda dapat menggunakan -newermtuntuk mencocokkan file yang terakhir dimodifikasi setelah tanggal tertentu.

find . -newermt '1 June' ! -newermt '1 September' -print

Tambahkan tahun jika Anda ingin mencocokkan file pada tahun tertentu, bukan tahun kalender saat skrip berjalan.

Jika implementasi find Anda tidak memiliki -newermt, Anda harus melakukannya -newer, yang membandingkan tanggal file yang findditemukan dengan file tetap. gunakan touchuntuk membuat file sementara dengan tanggal yang ingin Anda gunakan sebagai batas.

dir=$(mktemp -d)
touch -d 201306010000 "$dir/from"
touch -d 201309010000 "$dir/to"
find . -newer "$dir/from" ! -newer "$dir/to" -print
rm -r "$dir"
Gilles 'SANGAT berhenti menjadi jahat'
sumber