linux - Bash:将文件中的特定内容行移动到文件顶部

标签 linux bash shell awk sed

我正在制作一个脚本(在 vim 中),它遍历一个文件并查找特定的行。如果该行匹配,我希望将其移至文件顶部。

文件看起来像这样:

6596628c9cbab49b80d6a07d0304377768f5114e7f8b21edffa820aab1c508be, ./favicon.ico
150a04dd76f733e5ef05ece49de115d05f71efa8e73025e015dd4e0fb3217553, ./about.php
28acfc4b0d378c22a2c0e4913cae3d15aef9b21938de81be92f74aef85b0cc0e, ./info.php
67976bbbd1b62a00d454da3a9f95e72d97d0fd156d4c65a12707f2602cbea582, ./missing.php
6ed318718f4cc617c82121db7cde54188eac6f89c355f0bfe9d198218de7fffc, ./browse.php
abd277cc3453be980bb48cbffe9d1f7422ca1ef4bc0b7d035fda87cea4d55cbc, ./composer.phar
73ac79eccac12120dc601cd6cce1282a1d8a920d440d3d1141d257db1ed4b0f0, ./search.php
f412aabd74f4c99bd32c5e534132c565f52c2bd32fbf7f629eb5a4495ac46351, ./index.php
c2d49a4873088fbe635d8653494f7f1425b6ad9f55d63ee4de52170d8a8d01b8, ./content/style.css
18e7d61367d80bc125b309ac002bb3946c5e7ba419ef59537afc939eff799dfd, ./content/logo.png
d8da15f62d55641320f7e7c21d9be86db6d81f7667bbd35c738b4c917cad3ce9, ./robots.txt

我怎样才能将第 8 行 (index.php) 上的内容移动到顶部,使其看起来像这样:

f412aabd74f4c99bd32c5e534132c565f52c2bd32fbf7f629eb5a4495ac46351, ./index.php
6596628c9cbab49b80d6a07d0304377768f5114e7f8b21edffa820aab1c508be, ./favicon.ico
150a04dd76f733e5ef05ece49de115d05f71efa8e73025e015dd4e0fb3217553, ./about.php
28acfc4b0d378c22a2c0e4913cae3d15aef9b21938de81be92f74aef85b0cc0e, ./info.php
67976bbbd1b62a00d454da3a9f95e72d97d0fd156d4c65a12707f2602cbea582, ./missing.php
6ed318718f4cc617c82121db7cde54188eac6f89c355f0bfe9d198218de7fffc, ./browse.php
abd277cc3453be980bb48cbffe9d1f7422ca1ef4bc0b7d035fda87cea4d55cbc, ./composer.phar
73ac79eccac12120dc601cd6cce1282a1d8a920d440d3d1141d257db1ed4b0f0, ./search.php
c2d49a4873088fbe635d8653494f7f1425b6ad9f55d63ee4de52170d8a8d01b8, ./content/style.css
18e7d61367d80bc125b309ac002bb3946c5e7ba419ef59537afc939eff799dfd, ./content/logo.png
d8da15f62d55641320f7e7c21d9be86db6d81f7667bbd35c738b4c917cad3ce9, ./robots.txt

(该文件包含大约 9000 行)

如何最有效地做到这一点?

最佳答案

我认为可以使用 sed 来完成所需的操作: 该命令将用于获取文件中特定行的内容

sed -n "$LINE_NUMBER"p "$FILENAME"

该命令将用于删除指定行的文件内容

sed -i.bak -e "$LINE_NUMBER"'d' "$FILENAME"

最后,此命令将用于将字符串附加到文件顶部

sed -i -e "1i${LINE_CONTENT}" "$FILENAME"

将3个命令组合在一起,您可以执行您问题中提到的操作(test.log是包含您的示例输入的文件)

FILENAME="test.log"
LINE_NUMBER=8
LINE_CONTENT=$(sed -n "$LINE_NUMBER"p "$FILENAME")
sed -i.bak -e "$LINE_NUMBER"'d' "$FILENAME"
sed -i -e "1i${LINE_CONTENT}" "$FILENAME"

关于linux - Bash:将文件中的特定内容行移动到文件顶部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67031062/

相关文章:

linux - 用于选择文件和打印文件大小的 awk 脚本

javascript - 使用 Node.js 子进程时没有回车?

bash 测试产生 "echo: command not found"

linux - Bash 脚本中 FTP 将文件复制到远程计算机失败

linux - Linux 中的进程附加到哪个端口

linux - bash 脚本中的 pdsh

linux - rsync - 复制同名文件

bash - shell 脚本 : changing working dir and spaces in folder name

shell - 如何通过curl获取GitHub OAuth2状态码来模拟Web Application Flow?

linux - 是否可以使用 bash 函数检测参数末尾的空格?