我有类似以下的输出
975 Jan/21 - 19:59:36 ### sed "/^#include_dir/a include_dir = 'conf.d'" /opt/db/data/efa_bauen_ni_14/postgresql.conf
986 Jan/21 - 20:04:21 ### grep -l "^port = '5" /opt/db/data/postgres/efa_bauen_ni/conf.d/*.conf | xargs sed -i "s/port = '5/port = '6/"
现在我想将每一行简化为之后的所有内容$5
,这样我就可以得到实际的完整命令?
我想我可以做| awk {'print $6, $7, $8, $9, $10, $11'}
......等等。但感觉太不科学了,不够灵活而且很丑。
有人能建议如何实现这一点吗,或者我awk
一开始就走错了路?
示例数据看起来像是来自命令历史记录,可能是命令编号、日期、时间、序列,
###
然后是命令。在示例数据中,所有内容看起来排列整齐,因此问题变成了“如何删除前 29 个字符?”。Awk 不应该是您的首选,因为您可能希望保留有多个空格的位置,这意味着 awk 将内容拆分为字段对您没有用。是其中一种方法。第二种方法是观察是否存在固定字符串
###
,并且在此之前没有#
字符。因此,您可以使用正则表达式来匹配行首、零个或多个非字符#
,然后匹配固定字符串并删除它们。这种方法的优点是,如果数据发生变化,例如,如果命令号变得太大以至于需要额外的列来存储值,则此程序不需要进行任何更改。如果您确实想使用 awk,您可以使用
gsub
awk 来执行相同操作。以下是使用 POSIX awk剪切第一个 之前的所有内容的方法:
###
注意:它还会丢弃不包含
###
您可以使用
sed
,假设###
不会在一行中出现多次:输出
使用
Perl
一行代码打印第 5 列之后的所有内容:使用数组切片。
使用
-a
switch 时,默认情况下在数组中的Perl
行为类似awk
并按空格拆分@F
。您还可以使用它-F
来定义字段分隔符(可以是正则表达式)。通过
grep
支持-o
(输出匹配部分)和-P
(类似 perl 的正则表达式)的实现:<whitespace>###<whitespace>
将打印每行中第一次出现之后的内容。打印前 5 个空格分隔字段后面的所有内容。
更通用的答案,以防其他人对不同的数据集有类似的问题:
第一部分,
$1=$2=$3=$4=$5=""
将前 5 个字段设置为空字符。这样做的缺点是awk仍然记得 id 有这些字段,因此print $0
会在输出行前面留下空白。因此第二部分
$0=$0
去掉了前导和尾随的空格。然后第三部分
print $0
打印新的、缩短的行。是的,你走错了方向
awk
。我的意思是,你可以在 awk 中做到这一点,我稍后会向你展示如何做到这一点,但还有另一个工具,cut
它正是为此而设计的。如果你想打印从第 5 个到最后一个的所有字段,你可以这样做:指示使用空格作为分隔符,因为默认使用 TAB。然后,用于指示它
-d ' '
要打印哪些字段,这里我们指示它从第 5 个字段开始打印直到末尾 ( )。cut
ut
-f
5-
现在,如果你的文件结构不太好,如果你可以使用一个或多个空格作为分隔符,那么 awk 会是更好的选择,但它更复杂。你可以这样做,例如:
但这仍然会改变空格的数量,例如:
哪里
cut
不会:我相信您可以获得更优雅的 awk 解决方案,但实际上,
cut
这里是正确的工具。使用任何 POSIX awk:
或 GNU awk 用于
\s
/\S
:或 POSIX sed:
-E
或者具有支持 ERE 选项的 sed (例如 GNU 和 BSD seds):或 GNU sed 用于
-E
and\s
/\S
:awk '{for (i=6;i<=NF;i++) printf("%s%s",(i==6)? "":" ",$i); printf("\n"); } ' 文件.txt
使用Raku(以前称为 Perl_6)
上述 Raku 答案是为了补充 @GillesQuénot 发布的出色 Perl 答案而编写的。对于单行程序,Raku 简化了命令行标志的数量,同时添加了几个例程来补偿。
-ne
行标志指示 Raku 逐行执行代码而不自动打印(awk
类似行为)。.words
例程的缩写$_.words
意思是在空格处中断文本输入。.comb
例程用于全局选择/ \S+ /
一个或多个非空白字符。.[5..*]
然后使用它put
来输出将导致打印所需的列/元素切片,默认以(单个)空格字符作为分隔符。put
将自动添加 EOL 换行符。示例输入:
示例输出:
https://docs.raku.org
https://raku.org