将多行输出重定向到多个文件

时间:2018-08-10 22:41:29

标签: bash awk

我有一个URL列表,并且想确定什么是目录,什么不是:

https://www.example.com/folder/
https://www.example.com/folder9/
https://www.example.com/folder/file.sh
https://www.example.com/folder/text

我可以使用grep -e /$来查找哪个,但是我想执行一个内联命令,根据该逻辑可以重定向输出。

我知道awk在这里可能有答案,但是没有足够的awk经验来做到这一点。

类似的东西:

cat urls | if /$ matches write to folders.txt else write to files.txt

我可以将所有内容放到一个文件中,然后读取两次,但是当到达数千行时,我觉得效率很低。

3 个答案:

答案 0 :(得分:6)

是的,awk是一个很好的选择:

awk '/\/$/ { print > "folders.txt"; next }
           { print > "files.txt" }' urls.txt
  • /\/$/ { print > "folders.txt"; next },如果该行以/结尾,则将其写入folder.txt,然后跳至下一行
  • { print > "files.txt" }将所有其他行写入files.txt

如果文件中有尾随空格,则可能要使用表达式/\/[[:space:]]*$/而不是/\/$/

答案 1 :(得分:2)

您需要的是:

awk '{print > ((/\/$/ ? "folders" : "files")".txt")}' urls.txt

答案 2 :(得分:0)

使用coreutils,grep和bash进程替换:

<urls tee >(grep '/$' > folders.txt) >(grep -v '/$' > files.txt) > /dev/null