在awk中使用正则表达式打印第一个字段只有四个字符的行?

mun*_*ish 3 bash awk shell-script regular-expression

John Goldenrod:(916) 348-4278:250:100:175

Chet Main:(510) 548-5258:50:95:135

Tom Savage:(408) 926-3456:250:168:200

Elizabeth Stachelin:(916) 440-1763:175:75:300
Run Code Online (Sandbox Code Playgroud)

输出应包含仅包含四个字符的名称的行 (john,chet) :

awk '$1 ~ /[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]" "/ {print}' file
Run Code Online (Sandbox Code Playgroud)

这似乎对我不起作用。我可以在不使用任何 awk 函数的情况下做到这一点吗?

Ulr*_*gel 6

awk 中的字段默认以“ ”分隔,这意味着$1不包含空格,因此正确的正则表达式为$1

awk '$1 ~ /^[a-zA-Z0-9]{4}$/ {print}' file
Run Code Online (Sandbox Code Playgroud)

如果您想保留原始方法,您也可以$0改为使用,即:

awk '$0 ~ /^[a-zA-Z0-9]{4}\s/ {print}' file
Run Code Online (Sandbox Code Playgroud)

为了简化事情,您还可以使用\w而不是明确定义单词字符,即:

awk '$0 ~ /^\w{4}\s/ {print}' file
Run Code Online (Sandbox Code Playgroud)

如果您只想匹配空格而不是其他类似的东西,TAB您只需替换\s为“ ”(不带引号)。

您原始方法的另一个问题是缺少锚点。当你没有指定任何^也不$可以发生在任何地方你的模式,即模式将匹配Elizabeth Stachelinbeth