我有以下文件 foo.txt:
1
AbcdJ
8192
Pak78
8291
我想要一个 bash 脚本来提取所有包含仅有的整数(例如 1、8192,但不是 AbcdJ 或 Pak78)并将其输出到 bar.txt。
答案1
提取仅包含数字的行:
$ grep -E '^[[:digit:]]+$' foo.txt
1
8192
8291
将输出发送到bar.txt
:
grep -E '^[[:digit:]]+$' foo.txt >bar.txt
怎么运行的
当您想从文件中选择行时,grep
这是第一个要尝试的实用程序。
^[[:digit:]]+$
是正则表达式。其中,^
匹配行首、[[:digit:]]+
匹配一个或多个数字以及$
匹配行尾。由于此正则表达式以 开头^
并以 结尾$
,因此它仅匹配整行。仅匹配整行的另一种方法是使用选项-x
:
grep -xE '[[:digit:]]+' foo.txt >bar.txt
该选项-E
告诉grep
使用扩展正则表达式。这减少了在正则表达式中转义内容的需要。
所>
象征的重定向. 它使屏幕上显示的输出转到名为 的文件中bar.txt
。
答案2
AWK解决方案:
$> cat input.txt
1
AbcdJ
8192
Pak78
8291
3 blind mice
$> awk '/^[[:digit:]]+$/' input.txt
1
8192
8291
使用>
将输出重定向到文件
awk '/^[[:digit:]]+$/' input.txt > output.txt
答案3
其他一些工具:
sed
:$ sed -n '/^[0-9]\+$/ p' foo.txt 1 8192 8291
bash
,比其他方法慢:$ while IFS= read -r line; do [[ $line =~ ^[0-9]+$ ]] && echo "$line"; done <foo.txt 1 8192 8291
要将输出保存在另一个文件中,请使用输出重定向>
:
sed -n '/^[0-9]\+$/ p' foo.txt >output.txt
while IFS= read -r line; do [[ $line =~ ^[0-9]+$ ]] && echo "$line"; done <foo.txt >output.txt