我使用以下方法将文件的行放入数组中:
IFS=$'\r\n' GLOBIGNORE='*' command eval 'array=($(<filename))'
这会获取所有列,您以后可以使用它。
编辑:对上述过程的解释:
-
IFS=$'\r\n':代表“内部字段分隔符”。 shell 使用它来确定如何进行分词,即。 e.如何识别单词边界。
-
GLOBIGNORE='*':来自 bash 的手册页:以冒号分隔的模式列表,定义了路径名扩展要忽略的文件名集。如果与路径名扩展模式匹配的文件名也匹配 GLOBIGNORE 中的模式之一,则将从匹配列表中删除。
-
command eval:command eval 的加入可以让表达式保持在当前的执行环境中
-
array=...:简单的定义。
Stackoverflow 和 Stackexchange 上有不同的线程,并提供了更多详细信息:
https://unix.stackexchange.com/questions/184863/what-is-the-meaning-of-ifs-n-in-bash-scripting
https://unix.stackexchange.com/questions/105465/how-does-globignore-work
Read lines from a file into a Bash array
然后我只是像这样循环数组:
for (( b = 0; b < ${#array[@]}; b++ )); do
#Do Somethng
done
这可能是见仁见智。请等待更多的 cmets。
编辑:空行和全局的用例
在昨天的比赛之后。我终于有时间测试建议(空行,带球的行)
在这两种情况下,与 awk 一起使用时,数组都可以正常工作。在以下示例中,我尝试仅将 column2 打印到新的文本文件中:
IFS=$'\r\n' GLOBIGNORE='*' command eval 'array=($(<'$1'))'
for (( b = 0; b < ${#array[@]}; b++ )); do
echo "${array[b]}" | awk -F "/| " '{print $2}' >> column2.txt
done
从以下文本文件开始:
290729 123456
79076 12345
76789 123456789
59462 password
49952 iloveyou
33291 princess
21725 1234567
20901 rockyou
20553 12345678
16648 abc123
20901 rockyou
20553 12345678
16648 abc123
/*/*/*/*/*/*
20901 rockyou
20553 12345678
16648 abc123
清除脚本中的空行和 glob。
执行结果如下:
123456
12345
123456789
password
iloveyou
princess
1234567
rockyou
12345678
abc123
rockyou
12345678
abc123
*
rockyou
12345678
abc123
阵列按预期工作的明确证据。
执行示例:
adama@galactica:~$ ./processing.sh test.txt
adama@galactica:~$ cat column2.txt
123456
12345
123456789
password
iloveyou
princess
1234567
rockyou
12345678
abc123
rockyou
12345678
abc123
*
rockyou
12345678
abc123
如果我们希望删除空行(因为它在输出中对我没有意义),我们可以在 awk 中通过更改以下行来实现:
echo "${array[b]}" | awk -F "/| " '{print $2}' >> column2.txt
添加/./
echo "${array[b]}" | awk -F "/| " '/./ {print $2}' >> column2.txt
最终结果:
123456
12345
123456789
password
iloveyou
princess
1234567
rockyou
12345678
abc123
rockyou
12345678
abc123
*
rockyou
12345678
abc123
如果您希望将其应用于整个文件(而不是逐列),您可以查看以下线程:
AWK remove blank lines
编辑: rm 上的安全问题:
我实际上继续在测试文件中放置了 $(rm -rf ~) 以测试在虚拟机上会发生什么:
Test.txt 内容现在:
290729 123456
79076 12345
76789 123456789
59462 password
49952 iloveyou
33291 princess
21725 1234567
20901 rockyou
20553 12345678
16648 abc123
$(rm -rf ~)
20901 rockyou
20553 12345678
16648 abc123
/*/*/*/*/*/*
20901 rockyou
20553 12345678
16648 abc123
执行:
adama@galactica:~$ ./processing.sh test.txt
adama@galactica:~$ ll
total 28
drwxr-xr-x 3 adama adama 4096 dic 1 22:41 ./
drwxr-xr-x 3 root root 4096 dic 1 19:27 ../
drwx------ 2 adama adama 4096 dic 1 22:38 .cache/
-rw-rw-r-- 1 adama adama 144 dic 1 22:41 column2.txt
-rwxr-xr-x 1 adama adama 182 dic 1 22:41 processing.sh*
-rw-r--r-- 1 adama adama 286 dic 1 22:39 test.txt
-rw------- 1 adama adama 1545 dic 1 22:39 .viminfo
adama@galactica:~$ cat column2.txt
123456
12345
123456789
password
iloveyou
princess
1234567
rockyou
12345678
abc123
-rf
rockyou
12345678
abc123
*
rockyou
12345678
abc123
对系统没有影响。
注意:我在 VM 上使用 Ubuntu 18.04 x64 LTS。最好不要尝试使用 root 测试安全问题。
编辑:set -f必要性:
adama@galactica:~$ ./processing.sh a
adama@galactica:~$ cat column2.txt
[a]
adama@galactica:~$
没有set -f也能完美运行
BR