打印具有特定数量的特定字符的行

打印具有特定数量的特定字符的行

我有一个大文本,保存了大量文件路径及其信息

# just for demostration
/a/b/c/d/e
/a/b/c/d
/a/b/c
/a/b
/a
/b/c
/b
/c/d
/c
....

我只想显示那些具有特定数量的特定字符的内容,例如,

  1. 只有一个/
  2. 不超过两个/

这样我只提取根文件夹或仅提取到第一级子文件夹。

答案1

Awk解决方案:

-- 只有一个/

awk -v sep=1 'BEGIN{ FS=OFS="/"; sep += 1 }NF == sep' file

输出:

/a
/b
/c

-- 不超过两个/

awk -v sep=2 'BEGIN{ FS=OFS="/"; sep += 1 }NF <= sep' file

输出:

/a/b
/a
/b/c
/b
/c/d
/c

  • sep- 多变的;代表目录分隔器的计数
  • FSOFS- 分别是字段分隔符和输出字段分隔符
  • NF- 代表字段总数

如果您需要将上述方法组合成一个awk命令:

awk -v sep=1 'BEGIN{ FS=OFS="/"; sep += 1 }(sep==2 && NF==sep) || (sep>2 && NF<=sep)' file

答案2

使用扩展的正则表达式:

grep -E '^([^/]*/[^/]*){1,2}$' input

导致这些匹配:

/a/b
/a
/b/c
/b
/c/d
/c

正则表达式语法表示:

  • ^- 锚定到行的开头
  • ( ... )- 将以下位分组在一起
  • [^/]*- 任何非正斜杠字符,零个或多个
  • /- 正斜杠
  • [^/]*- 任何非正斜杠字符,零个或多个
  • {1,2}- 其中一组或两组
  • $- 锚定到线的末端

相关内容