linux – 如何使用grep / awk / sed打印所有字符,直到某个模式(不包括模式本身).

例如
echo "abc-1234a :" | grep <do-something>

只打印abc-1234a

解决方法

我认为这些更接近你所得到的,但不知道你真正想要达到的目标,很难说.
echo "abc-1234a :" | egrep -o '^[^:]+'

…虽然这也会匹配没有冒号的行.如果你只想要带冒号的行,并且你必须只使用grep,这可能有效:

echo "abc-1234a :" | grep : | egrep -o '^[^:]+'

当然,这只有在您的回声“abc-1234a:”是一个可能被多行输入替换的示例时才有意义.

你可以使用的最小工具可能是削减:

echo "abc-1234a :" | cut -d: -f1

并且sed总是可用的……

echo "abc-1234a :" | sed 's/ *:.*//'

对于最后一个,如果您只想打印包含冒号的行,请将其更改为:

echo "abc-1234a :" | sed -ne 's/ *:.*//p'

哎呀,你甚至可以用纯粹的bash做到这一点:

while read line; do
  field="${line%%:*}"
  # do stuff with $field
done <<<"abc-1234a :"

有关%%位的信息,您可以使用bash并搜索“参数扩展”.

更新:

你说:

It’s the characters in the first line of input before the colon. The
input Could have multiple line though.

因此,使用grep的解决方案可能不是您的最佳选择,因为它们还会打印可能包含冒号的后续行中的数据.当然,有很多方法可以解决这个问题.我们将从示例输入开始:

$function sample { printf "abc-1234a:foo\nbar baz:\nNarf\n"; }
$sample
abc-1234a:foo
bar baz:
Narf

您可以使用多个管道,例如:

$sample | head -1 | grep -Eo '^[^:]*'
abc-1234a
$sample | head -1 | cut -d: -f1      
abc-1234a

或者您可以使用sed仅处理第一行:

$sample | sed -ne '1s/:.*//p'
abc-1234a

或者告诉sed在打印第一行后退出(这比读取整个文件要快):

$sample | sed 's/:.*//;q'
abc-1234a

或者做同样的事情,但只有在找到冒号时才显示输出(为安全起见):

$sample | sed -ne 's/:.*//p;q'
abc-1234a

或者让awk做同样的事情(分别是最后3个例子):

$sample | awk '{sub(/:.*/,"")} NR==1'
abc-1234a
$sample | awk 'NR>1{nextfile} {sub(/:.*/,"")} 1'
abc-1234a
$sample | awk 'NR>1{nextfile} sub(/:.*/,"")'
abc-1234a

或者在bash中,根本没有管道:

$read line < <(sample)
$printf '%s\n' "${line%%:*}"
abc-1234a

相关文章

Linux中的ARP防火墙主要用于防御ARP欺骗攻击,其效果取决于多...
insmod和modprobe加-f参数导致Invalid module format错误 这...
将ArchLinux安装到U盘 几个月前入门Arch的时候上网搜了不少安...
1、安装Apache。 1)执行如下命令,安装Apache服务及其扩展包...
一、先说一下用ansible批量采集机器信息的实现办法: 1、先把...
安装配置 1. 安装vsftpd 检查是否安装了vsftpd # rpm -qa | ...