2017-04-24 4 views
1

Ich kämpfe um dieses Verhalten zu verstehen:Csh - Fetching Felder innen über awk xargs

Script Verhalten: Lesen einer Datei (mit Datumsangaben); Drucken Sie eine Liste von Dateien in einer mehrstufigen Verzeichnisstruktur und ermitteln Sie deren Größe, drucken Sie nur die Dateigröße (zukünftiger Schritt: summieren Sie die Gesamtdateigröße).

Startskript:

cat dates | xargs -I {} sh -c "echo '{}: '; du -d 2 "/folder/" | grep {} | head" 
2000-03: 
1000 /folder/2000-03balbasldas 
2000-04: 
12300 /folder/2000-04asdwqdas 
[and so on] 

Aber wenn ich versuche, auf dem ersten Feld über awk zu filtern, bekomme ich noch die ganze Linie

cat dates | xargs -I {} sh -c "echo '{}: '; du -d 2 "/folder/" | grep {} | awk '{print $1}'" 
2000-03: 
    1000 /folder/2000-03balbasldas 
    2000-04: 
    12300 /folder/2000-04asdwqdas 

Ich habe schon näherte es über Divide-et -impera und der folgende Befehl funktioniert just fine:

du -d 2 "/folder/" | grep '2000-03' | awk '{print $1}' 
1000 

Ich fürchte, dass mir etwas sehr Triviales fehlt, aber bis jetzt habe ich noch nichts gefunden.

Irgendeine Idee? Vielen Dank!

Eingang: Verzeichnis mit Ordnern YYYY-MM-random_data und eine Datei mit Zeichenketten benannt:

ls -l 
drwxr-xr-x 2 user staff 68 Apr 24 11:21 2000-03-blablabla 
drwxr-xr-x 2 user staff 68 Apr 24 11:21 2000-04-blablabla 
drwxr-xr-x 2 user staff 68 Apr 24 11:21 2000-05-blablabla 
drwxr-xr-x 2 user staff 68 Apr 24 11:21 2000-06-blablabla 
drwxr-xr-x 2 user staff 68 Apr 24 11:21 2000-06-blablablb 
drwxr-xr-x 2 user staff 68 Apr 24 11:21 2000-06-blablablc 
[...] 

cat dates 
2000-03 
2000-04 
2000-05 
[...] 

Erwartete Ausgabe: Summe der Raumscheibe durch alle in dem Ordner enthaltenen Dateien belegt, deren Namen enthalten die Zeichenfolge in der Datei

2000-03: 1000 
2000-04: 2123 
2000-05: 1222112 
[...] 

====== Daten Aber insbesondere interessiert mich, warum awk nicht in der Lage ist, die Spalte $ 1 zu holen, die ich darum gebeten habe.

+0

Geben Sie uns eine minimale Eingabe und eine genaue Ausgabe, die Sie suchen. Anstatt anzugeben, wie Ihre Versuche fehlgeschlagen sind. – Inian

+0

@Inische Details hinzugefügt. – Rob013

Antwort

0

Benutzung von GNU Parallel es wie folgt aussieht:

parallel --tag "eval du -s folder/{}* | perl -ne '"'$s+=$_ ; END {print "$s\n"}'"'" :::: dates 

--tag prepends die Zeile mit dem Datum.

{} wird durch das Datum ersetzt.

eval du -s folder/{}* findet alle Verzeichnisse beginnend mit dem Datum und gibt die Summe du aus diesen Verzeichnissen.

perl -ne '$s+=$_ ; END {print "$s\n"}' fasst die Ausgabe von du

Schließlich gibt es wenig Trickserei zitierte es richtig zu bekommen zitiert.