Você precisa usar operador de correspondência ~ , não operador de subtração - :
$ awk '$2 ~ /^2$/' file
ou use o operador de igualdade == como a resposta do @glenn jackman .
Mas vamos dar uma olhada em sua solução anterior, para explicar por que você tem todas as linhas.
awk '$2 - /^2$/ {print}' numbers.txt
Aqui, com cada entrada de linha, se a expressão $2 - /^2$/ for verdadeira, você imprimirá esta linha, senão não fará nada. Como você tem todas as linhas, parece que a expressão $2 - /^2$/ sempre foi avaliada como verdadeira.
Como awk avaliou essa expressão?
Quando você usa o operador de subtração, o resultado do tipo é numérico. $2 variable era um número, mas /^2$/ é uma expressão regular, qual é o seu valor numérico?
Bem, da documentação do POSIX awk :
When an ERE token appears as an expression in any context other than as the right-hand of the '˜' or "!˜" operator or as one of the built-in function arguments described below, the value of the resulting expression shall be the equivalent of:
$0 ˜ /ere/
Então, seu programa awk se torna:
awk '$2 - ($0 ~ /^2$/) {print}' numbers.txt
Você pode ver que cada linha de entrada será verificada com a expressão regular /^2$/ . Como nenhuma das suas linhas de entrada corresponde, o resultado da expressão $0 ~ /^2$/ será 0.
Com sua entrada, todos os segundos campos têm valor maior que 0 (subtraia para 0, mantenha-o inalterado), que são o valor verdadeiro em awk . Portanto, a expressão $2 - /^2$/ é sempre verdadeira, porque awk imprime todas as linhas.