使用 bash 从文本文件中提取数据

使用 bash 从文本文件中提取数据

我正在寻找一个 bash 脚本。在一个文本文件中,我有如下数据:

+------+------
| Id   | User | 
+------+------+
| 8192 | root | 
| 8194 | root |
| 8202 | root |
| 8245 | root | 
| 8434 | root |  
| 8754 | root | 
| 8761 | root | 
| 8762 | root | 
| 8764 | root | 
| 8771 | root | 
+------+------+

我想提取这样的数据:

8192,8194,8202,8245,8434,8754,8761,8762,8764

我的意思是,我需要第一个包含数字的字段,但不包含最后一个字段,并且所有提取的数字都应该用逗号(,)分隔。

有人可以帮我得到它吗?

答案1

这么简单的事情你不需要脚本。你可以使用awk

awk '$2 ~ "^[0-9][0-9]*$" { print $2 }' file.txt | head -n -1 | awk '{print}' ORS=',' | sed 's/,$/\n/'

一些解释:

  • awk '$2 ~ "^[0-9][0-9]*$" { print $2 }' file.txtfile.txt-仅从数字字段打印。
  • head -n -1- 删除最后一行/最后一个数字。
  • awk '{print}' ORS=','- 将所有行合并为一行,每个数字用 分隔,
  • sed 's/,$/\n/'-,用换行符替换最后一个。

或者更短一点:

awk '$2 ~ "^[0-9][0-9]*$" { print $2 }' ORS=',' file.txt | sed 's/,[0-9]*,$/\n/'

答案2

我能找到的最短路径:

echo `sed 's/[^0-9]//g' your_file` | sed 's/ /,/g'

结果是:

8192,8194,8202,8245,8434,8754,8761,8762,8764,8771

[^0-9]- 表示除数字以外的一切

s/[^0-9]//g- 删除除数字之外的所有内容

your_file用文件路径替换


最后为你完成任务,发出kill命令。使用此行时要小心,它将杀死列表中的每个 PID

for pid in `sed 's/[^0-9]//g' your_file | grep -v '^$'`; do kill -9 $pid;done

在运行上一行之前,您可能需要运行此行:

for pid in `sed 's/[^0-9]//g' your_file | grep -v '^$'`; do echo "kill -9 $pid";done

它将显示如下内容:

kill -9 8192
kill -9 8194
kill -9 8202
kill -9 8245
kill -9 8434
kill -9 8754
kill -9 8761
kill -9 8762
kill -9 8764
kill -9 8771

祝你好运!

答案3

这是满足您目的的一行代码,

sed 's/[^0-9]//g' file.txt| xargs | sed 's/ /,/g'

或者

sed 's/[+|IdUserroot\-]*//g' file.txt | xargs | sed 's/ /,/g'

输出:

8192,8194,8202,8245,8434,8754,8761,8762,8764,8771

解释

man sed

s/regexp/replacement/
          Attempt  to  match  regexp  against the pattern space.  If successful, replace that
          portion matched with replacement.  The replacement may contain the special  charac‐
          ter  & to refer to that portion of the pattern space which matched, and the special
          escapes \1 through \9 to refer to the corresponding matching sub-expressions in the
          regexp.

g     Copy/append hold space to pattern space.

正则表达式[维基百科]

[^ ]    Matches a single character that is not contained within the brackets.
For example, [^abc] matches any character other than "a", "b", or "c". [^0-9]
matches any single character that is not a number from "0" to "9".

因此sed我用空格替换了所有内容。接下来xargs将它们放在一行中,用空格隔开,

$ sed 's/[^0-9]//g' file.txt| xargs
8192 8194 8202 8245 8434 8754 8761 8762 8764 8771

,最后一步,我使用替换了所有空格sed

答案4

我认为这就是您所需要的。其他一些答案未能删除最后一部分。

sed -n 's/.*\([0-9]\{4\}\).*/\1/p' file | sed ':a;N;$!ba;s/\n/,/g; s/\(.*\),\(.*\)$/\1/g'

举个小例子,

$ (echo '| Id   | User |'; echo '| 8192 | root |'; echo '| 8194 | root |'; echo '| 8771 | root |') | sed -n 's+.*\([0-9]\{4\}\).*+\1+p' | sed ':a;N;$!ba;s/\n/,/g; s/\(.*\),\(.*\)$/\1/g'
8192,8194

相关内容