grep에서 "->"를 패턴으로 사용하도록 만드는 방법은 무엇입니까?

grep에서 "->"를 패턴으로 사용하도록 만드는 방법은 무엇입니까?

다음과 같은 파일에 이 텍스트가 있습니다 temp.

-rw-r--r-- 1 root root  15776 Oct 15  2010 dnd-copy
-rw-r--r-- 1 root root  15776 Oct 15  2010 dnd-link
-rw-r--r-- 1 root root  15776 Oct 15  2010 dnd-move
-rw-r--r-- 1 root root  15776 Oct 15  2010 dnd-none
-rw-r--r-- 1 root root  15776 Oct 15  2010 dotbox
lrwxrwxrwx 1 root root      5 Oct  8  2012 cross_reverse -> cross
lrwxrwxrwx 1 root root      5 Oct  8  2012 diamond_cross -> cross
lrwxrwxrwx 1 root root      6 Oct  8  2012 dot_box_mask -> dotbox
lrwxrwxrwx 1 root root     17 Oct  8  2012 double_arrow -> sb_v_double_arrow
lrwxrwxrwx 1 root root      9 Oct  8  2012 draft_large -> right_ptr

를 실행하면 egrep -v 'lrwx' temp마지막 5개 행이 제거됩니다.

나는 running 을 실행하면 egrep -v '->' temp이후 동일한 5개 행을 제거 lrwx하고 ->동일한 행에 나타날 것으로 예상했습니다.

그러나 다음 오류가 발생합니다.

[09:43 PM] ~/Desktop $ egrep -v '->' temp
egrep: invalid option -- '>'
Usage: egrep [OPTION]... PATTERN [FILE]...
Try 'egrep --help' for more information.

아무 소용이 없었 습니다 egrep -v '-\>' temp.

[09:46 PM] ~/Desktop $ egrep -v '-\>' temp
egrep: invalid option -- '\'
Usage: egrep [OPTION]... PATTERN [FILE]...
Try 'egrep --help' for more information.

egrep(또는 을 사용해도 동일한 결과를 얻습니다 grep -E.)

답변1

->grep는 선행으로 인해 옵션으로 해석됩니다 -. 두 가지 방법을 사용할 수 있습니다.

grep -- '->' # Explicitly declare end of arguments using --
grep '\->'   # Escape -, which still evaluates to -.

기록에 따르면, ls를 구문 분석하는 것은 기호 링크를 찾는 나쁜 방법이며, 특히 추가 구문 분석을 시도하는 경우 쉽게 잘못된 긍정이나 데이터 손상으로 이어질 수 있습니다. (bash에서는) 다음과 같은 것이 더 좋을 것입니다:

shopt -s nullglob
for file in *; do
    [[ -h $file ]] || continue
    printf '%s -> %s\n' "$file" "$(readlink "$file")"
done

관련 정보