如何使用sed命令在shell脚本中单独提取特定的字段空间

fnatzsnv  于 2023-10-23  发布在  Shell
关注(0)|答案(4)|浏览(139)
  • 输入文件:Test.txt*
-rw-r--r--  1 dev dev  93K Sep 18 05:37 Server-23091805496-2-AC.log
-rw-r--r--  1 dev dev  40K Sep 18 05:44 ServerM-23090331-5709-log.log
-rw-r--r--  1 dev dev 484K Sep 18 05:46 Server-280334-12570-log.log
-rw-r--r--  1 dev dev 235K Sep 18 05:47 Server-233405500-1-AC.log

第一个文件输出:

Sep 18 05:37 Server-23091805496-2-AC.log
Sep 18 05:44 ServerM-23090331-5709-log.log
Sep 18 05:46 Server-280334-12570-log.log
Sep 18 05:47 Server-233405500-1-AC.log

第二个文件输出:

Server-23091805496-2-AC.log
ServerM-23090331-5709-log.log
Server-280334-12570-log.log
Server-233405500-1-AC.log

**已在下面尝试:*1.sed 's/ /\n/g' Test.txt2.ls -ltr| grep“Sep 18 08:“|sed -n '1p'| cut -d "-f2

vs91vp4v

vs91vp4v1#

一个答案可能是:

sed <input.txt -e 's/.*K //g;w file1.txt' -e 's/.* //g;' >file2.txt

或者更好:

sed <input.txt -e '
   s/^\([^[:space:]]\+[[:space:]]\+\)\{5\}//;
   w file1.txt' -e '
   s/\([^[:space:]]\+[[:space:]]\+\)\{3\}//;' >file2.txt

哪里

  • sed只运行一次,没有任何分支到其他工具,
  • 第一次删除 * 所有内容,直到第一个提案中的K*,

在第二个建议中,删除非空格后跟空格,重复5次

  • 然后w写入文件file1.txt
  • 在这一点上,第一个脚本部分以第二个引号结束,然后脚本的第二部分以-e sed参数开始(请参阅stevesliva的评论以了解有关此的解释)。
  • 删除所有内容,直到第一个提案中的最后一个空格,

在第二个建议中,删除非空格后跟空格,重复3次

  • 然后将sed的 * 标准输出 * 发送到file2.txt

如果ls -l在某些语言中显示日期,如 * 法语 * 打印日作为第一个字段,对齐为2个字符(%2d),要在file1.txt中保持 day 字段 * 对齐 *,您可以在第一个sed命令中添加一个小的2个字符要求:

ls -l /some/path | sed -e '
   s/^\([^[:space:]]\+[[:space:]]\+\)\{5\}\( [0-9] \|[0-9]\{2\} \|[A-Z]\)/\2/;
   w file1.txt' -e '
   s/^ \?\([^[:space:]]\+[[:space:]]\+\)\{3\}//;' >file2.txt

所以第一个字段是一个 * 空格后跟一个数字 * 或 * 两个数字 *。(在最后一个替换命令的开始处添加一个 * 潜在 * 空格)。

**注意:**在这里,我使用了 redirection 作为输入(<input.txt),但这不是必要的。请阅读我的评论,以回答马克·塞特的评论。

vx6bjr1n

vx6bjr1n2#

这个工作是为awk不是为sed。试试这个:

$ echo '-rw-r--r--  1 dev dev  93K Sep 18 05:37 Server-23091805496-2-AC.log' | awk '{print $1}'
-rw-r--r--
$ echo '-rw-r--r--  1 dev dev  93K Sep 18 05:37 Server-23091805496-2-AC.log' | awk '{print $5}'
93K
$ echo '-rw-r--r--  1 dev dev  93K Sep 18 05:37 Server-23091805496-2-AC.log' | awk '{print $9}'
Server-23091805496-2-AC.log
vlf7wbxs

vlf7wbxs3#

这可能对你有用(GNU sed):

sed -Ene 'h;s/\s*\S*//6g;G;s/(.*)\n\1\s*//;w file1' 
      -e 'h;s/\s*\S*//4g;G;s/(.*)\n\1\s*//;w file2' file

为你想要删除的字符串做一个掩码,删除它们并将结果写入文件。
在这种情况下,请对第二个文件执行两次操作。

yqlxgs2m

yqlxgs2m4#

使用revawk

$ rev Test.txt|awk 'NF=4'|rev
Sep 18 05:37 Server-23091805496-2-AC.log
Sep 18 05:44 ServerM-23090331-5709-log.log
Sep 18 05:46 Server-280334-12570-log.log
Sep 18 05:47 Server-233405500-1-AC.log

$ rev Test.txt|awk 'NF=1'|rev
Server-23091805496-2-AC.log
ServerM-23090331-5709-log.log
Server-280334-12570-log.log
Server-233405500-1-AC.log

相关问题