Hi,
ich habe (immer noch) keine Ahnung von awk
und bräuchte mal Hilfe von jemanden, der es kann. Denn: ich habe in einem Skript eine Funktion in bash
, die mittels einer while-Schleife den Output von einem stat
-Befehl liest und in einem assoziativen Array verarbeitet. Da dies bei der Auslese von mehreren hundert Dateien in meinem Fall zu lang dauert, will ich mal austesten, ob es mittles awk
besser ginge. Ich denke mir dabei, dass awk
die Arrays vorbereitet und so ausgibt, dass ich sie in bash
deklarieren/initiieren kann:
1 | declare $(stat | awk '{print "aa["KEY"]="FIELD}') |
Die Funktion sieht in etwa so aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | #!/usr/bin/env bash # -- DEBUGGING. declare vars_base=$(set -o posix ; set) # -- MAIN. # stat: format sequences # %A access rights in human readable form # %N quoted file name with dereference if symbolic link # %s total size, in bytes # %X time of last access, seconds since Epoch # %Y time of last data modification, seconds since Epoch # %Z time of last status change, seconds since Epoch builtin declare -g \ LC_COLLATE=C \ show_hidden= \ hidden_filter='^\.|~$' builtin declare -gA data builtin shopt -s dotglob __build_data() { builtin declare \ basename= \ dirname=$1 \ file= builtin declare -i i=0 builtin declare -a "array=()" while IFS= builtin read -r -d $'\0' do builtin set -- $REPLY file=${@:6:$#} file=${file#‘} file=${file%’} basename=${file##*/} [[ $show_hidden != show_hidden && $basename =~ $hidden_filter ]] && builtin continue data[atime ${file}]=$3 data[basename ${file}]=$basename data[ctime ${file}]=$5 data[index ${file}]=$i data[mtime ${file}]=$4 data[size ${file}]=$2 if [[ -L $file ]] then data[type ${file}]="l${1:0:1}" else data[type ${file}]=" ${1:0:1}" fi array[$i]=$basename ((i++)) done < <(command stat -L --printf='%A %s %X %Y %Z %N\0' "${dirname}"${2}) data[list ${dirname:-/}]=$(builtin printf '%s\n' "${array[@]}") } __build_data "$HOME" "/*" # -- DEBUGGING. fgrep -v -e "$vars_base" < <(set -o posix ; set) | \ egrep -v -e "^BASH_REMATCH=" \ -e "^BASHOPTS=" \ -e "^OPTIND=" \ -e "^REPLY=" \ -e "^BASH_LINENO=" \ -e "^BASH_SOURCE=" \ -e "^FUNCNAME=" |
Hat jemand Lust, mir zu helfen?
Gruß 🐸