簡體   English   中英

在 bash 中使用 for 循環創建目錄

[英]Created directory with for loop in bash

我有這些文件。 想象一下,每個“測試”代表一台服務器的名稱:

test10.txt
test11.txt
test12.txt
test13.txt
test14.txt
test15.txt
test16.txt
test17.txt
test18.txt
test19.txt
test1.txt
test20.txt
test21.txt
test22.txt
test23.txt
test24.txt
test25.txt
test26.txt
test27.txt
test28.txt
test29.txt
test2.txt
test30.txt
test31.txt
test32.txt
test33.txt
test34.txt
test35.txt
test36.txt
test37.txt
test38.txt
test39.txt
test3.txt
test40.txt
test4.txt
test5.txt
test6.txt
test7.txt
test8.txt
test9.txt

在每個 txt 文件中,我都有這種類型的數據:

2019-10-14-00-00;/dev/hd1;1024.00;136.37;/
2019-10-14-00-00;/dev/hd2;5248.00;4230.53;/usr
2019-10-14-00-00;/dev/hd3;2560.00;481.66;/var
2019-10-14-00-00;/dev/hd4;3584.00;67.65;/tmp
2019-10-14-00-00;/dev/hd5;256.00;26.13;/home
2019-10-14-00-00;/dev/hd1;1024.00;476.04;/opt
2019-10-14-00-00;/dev/hd5;384.00;0.38;/usr/xxx
2019-10-14-00-00;/dev/hd4;256.00;21.39;/xxx
2019-10-14-00-00;/dev/hd2;512.00;216.84;/opt
2019-10-14-00-00;/dev/hd3;128.00;21.46;/var/
2019-10-14-00-00;/dev/hd8;256.00;75.21;/usr/
2019-10-14-00-00;/dev/hd7;384.00;186.87;/var/
2019-10-14-00-00;/dev/hd6;256.00;0.63;/var/
2019-10-14-00-00;/dev/hd1;128.00;0.37;/admin
2019-10-14-00-00;/dev/hd4;256.00;179.14;/opt/
2019-10-14-00-00;/dev/hd3;2176.00;492.93;/opt/
2019-10-14-00-00;/dev/hd1;256.00;114.83;/opt/
2019-10-14-00-00;/dev/hd9;256.00;41.73;/var/
2019-10-14-00-00;/dev/hd1;3200.00;954.28;/var/
2019-10-14-00-00;/dev/hd10;256.00;0.93;/var/
2019-10-14-00-00;/dev/hd10;64.00;1.33;/
2019-10-14-00-00;/dev/hd2;1664.00;501.64;/opt/
2019-10-14-00-00;/dev/hd4;256.00;112.32;/opt/
2019-10-14-00-00;/dev/hd9;2176.00;1223.1;/opt/
2019-10-14-00-00;/dev/hd11;22784.00;12325.8;/opt/
2019-10-14-00-00;/dev/hd12;256.00;2.36;/
2019-10-14-06-00;/dev/hd12;1024.00;137.18;/
2019-10-14-06-00;/dev/hd1;256.00;2.36;/
2019-10-14-00-00;/dev/hd1;1024.00;136.37;/
2019-10-14-00-00;/dev/hd2;5248.00;4230.53;/usr
2019-10-14-00-00;/dev/hd3;2560.00;481.66;/var
2019-10-14-00-00;/dev/hd4;3584.00;67.65;/tmp
2019-10-14-00-00;/dev/hd5;256.00;26.13;/home
2019-10-14-00-00;/dev/hd1;1024.00;476.04;/opt
2019-10-14-00-00;/dev/hd5;384.00;0.38;/usr/xxx
2019-10-14-00-00;/dev/hd4;256.00;21.39;/xxx
2019-10-14-00-00;/dev/hd2;512.00;216.84;/opt
2019-10-14-00-00;/dev/hd3;128.00;21.46;/var/
2019-10-14-00-00;/dev/hd8;256.00;75.21;/usr/
2019-10-14-00-00;/dev/hd7;384.00;186.87;/var/
2019-10-14-00-00;/dev/hd6;256.00;0.63;/var/
2019-10-14-00-00;/dev/hd1;128.00;0.37;/admin
2019-10-14-00-00;/dev/hd4;256.00;179.14;/opt/
2019-10-14-00-00;/dev/hd3;2176.00;492.93;/opt/
2019-10-14-00-00;/dev/hd1;256.00;114.83;/opt/
2019-10-14-00-00;/dev/hd9;256.00;41.73;/var/
2019-10-14-00-00;/dev/hd1;3200.00;954.28;/var/
2019-10-14-00-00;/dev/hd10;256.00;0.93;/var/
2019-10-14-00-00;/dev/hd10;64.00;1.33;/
2019-10-14-00-00;/dev/hd2;1664.00;501.64;/opt/
2019-10-14-00-00;/dev/hd4;256.00;112.32;/opt/

我想為每個服務器創建一個目錄,在每個目錄中為每個 FS 創建一個 txt 文件,並將與 FS 對應的每一行放入這些 txt 文件中。

為此,我嘗試循環:

#!/bin/bash

directory=(ls *.txt | cut -d'.' -f1)
for d in $directory
do
        if [ ! -d $d ]
        then
                mkdir $d
        fi
done

for i in $(cat *.txt)
do
        file=$(echo $i | awk -F';' '{print $2}' | sort | uniq | cut -d'/' -f3 )
        data=$(echo $i | awk -F';' '{print $2}' )
        echo $i | grep -w $data >> /xx/xx/xx/xx/xx/${directory/${file}.txt
done

但是這個循環不能正常工作。 會創建目錄,但不會創建每個目錄中的文件。

我想要類似的東西:

test1/hd1.txt(hd1.txt 中 hd1 fs 的每一行)

每台服務器都一樣。

你能告訴我怎么做嗎?

#!/bin/bash

for src in *.txt; do
    # start a subshell so we don't need to cd back afterwards
    # make "$src" be stdin before cd, so we don't need full path
    # be careful that in subshell only awk reads from stdin
    (
        # extract server name to use as directory
        dir=/xx/xx/xx/xx/xx/"${src%.txt}"

        # chain with "&&" so failures don't cause bad files
        mkdir -p "$dir" &&
        cd "$dir" &&
        awk -F \; '{ split($2, dev, "/"); print > dev[3]".txt" }'
    ) < "$src"
done
  • awk 腳本讀取以分號分隔的行。
  • 它在斜杠上拆分第二個字段以提取設備名稱(假設設備始終具有以下形式: /dev/ name
  • 最后, >將輸出發送到相關文件。

作為參考,您可以通過執行directory=$(...)來使您的腳本工作; 將前綴添加到mkdir (假設前綴目錄已經存在); 關閉引用${directory} 並引用所有變量引用以確保安全:

#!/bin/bash

directory=$(ls *.txt | cut -d'.' -f1)
for d in "$directory"
do
        if [ ! -d "$d" ]
        then
                mkdir /xx/xx/xx/xx/xx/"$d"
        fi
done

for i in $(cat *.txt)
do
        file=$(echo "$i" | awk -F';' '{print $2}' | sort | uniq | cut -d'/' -f3 )
        data=$(echo $i | awk -F';' '{print $2}' )
        echo "$i" | grep -w "$data" >> /xx/xx/xx/xx/xx/"${directory}"/"${file}".txt
done
for file in `ls *.txt`
do
    echo ${file}
    directory=`echo ${file} | cut -d'.' -f1`
    #echo ${directory}
    if [ ! -d ${directory} ]
    then
        mkdir ${directory}
    fi
    FS=`cat ${file} | awk -F';' '{print $2}' | sort | uniq | cut -d'/' -f3`
    #echo $FS
    for f in $FS
    do
        cat ${file} |grep -w -e $f > ${directory}/${f}.txt
    done
done

解釋:

對於當前目錄中的每個文件,都會運行外部 for 循環。

在所選文件的循環中,將首先創建相應的目錄。

接下來使用 FS 變量,我們從所選文件中獲取所有可能的文件系統。

最后,將使用 FS 類型運行內部循環以 grep 並在目錄中創建單獨的文件系統文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM