我正在寻找一个 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.txt
file.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