ls -l
처음 4개 열을 제거하여 명령에 표시되는 열을 제한하고 싶습니다.
ls -lh
보여주다:
drwxr-sr-x 20 gamma alpha 4.0K May 22 13:18 Desktop
drwxr-sr-x 3 gamma alpha 22 Oct 6 2014 Eclipse
-rw-r--r-- 1 gamma alpha 28K Jul 11 2014 fire
drwxr-sr-x 5 gamma alpha 48 Mar 31 2014 lb_deployment
처음 4개 열을 제거하기 위해 ls -lh | cut -d " " -f5-
. 그러나 예상대로 동작하지 않습니다.
4.0K May 22 13:18 Desktop
alpha 22 Oct 6 2014 Eclipse
alpha 28K Jul 11 2014 fire
alpha 48 Mar 31 2014 lb_deployment
나는 다음과 같은 모습을 좋아합니다.
4.0K May 22 13:18 Desktop
22 Oct 6 2014 Eclipse
28K Jul 11 2014 fire
48 Mar 31 2014 lb_deployment
예상대로 동작하지 않는 이유는 에서 cut
구분자를 공백( -d " "
)으로 정의했는데 첫 번째 파일( 의 두 번째 열)에 대한 링크 수가 \ls -lh
2자리 숫자(20)이므로 ls -lh
하나 더 추가했기 때문입니다. 1비트 링크 카운터를 사용하면 파일의 링크 카운터에 공백이 추가되어 열 위치를 조정할 수 있습니다. 이로 인해 cut
예기치 않은 동작이 발생합니다.
이 문제를 해결하는 방법에 대한 아이디어가 있습니까?
답변1
사용자 및 그룹 열을 생략하려면 -o
및 옵션을 전달합니다 . -g
사용자 및 그룹 이름에는 공백이 포함될 수 있으므로 안정적으로 편집할 수 없습니다.
권한 및 링크 수 열을 생략할 수 있는 옵션은 없습니다. 유지하려는 첫 번째 열은 공백(오른쪽 정렬의 경우)으로 시작할 수 있으므로 공백을 공백이 아닌 변환으로 시작 기준으로 사용할 수 없습니다. 대신, 마지막 열의 오른쪽 가장자리를 사용하여 원하지 않는 열을 제거하세요. 처음 두 열에는 공백이 포함될 수 없으므로 안전합니다.
ls -lhog | sed 's/^[^ ][^ ]* *[^ ][^ ]* //'
sed 명령 설명:
s/REGEXP/REPLACEMENT/
각 줄에서 지정된 정규식의 첫 번째 항목을 지정된 대체 텍스트로 바꿉니다. 여기의 대체 텍스트가 비어 있습니다.^
줄의 시작 부분에서만 일치하도록 정규식의 시작 부분에 추가합니다.[^ ][^ ]*
공백을 제외하고 비어 있지 않은 문자 시퀀스와 일치합니다.- 따라서 sed 명령은 공백이 아닌 첫 번째 및 두 번째 시퀀스와 다음 공백을 제거합니다(그러나 끝에 공백은 하나만 있음).
답변2
이것은 나에게 효과적입니다.
ls -lhn | sed -r 's#^\S+(\s+\S+){3}##'
사용자 및 그룹 이름을 숫자 ID로 변환하는 추가 -n
플래그입니다 . ls
결과적으로 우리는 제거할 알려진 수의 필드를 얻습니다.
-rwxr-xr-x 1 1001 1001 1.4K Mar 23 18:07 something.sh
각 열 사이의 공백은 가변적이지만 ls
열을 정렬하는 데 사용되므로 맹목적으로 제거할 수는 없습니다. 나는 주요 권한 블록을 제거한 다음 세 그룹을 제거하기로 결정했습니다.빈 텍스트와 비어 있지 않은 텍스트, 각각 링크 수, uid 및 gid와 일치합니다. 그러면 정렬이 계속 작동할 수 있도록 gid와 파일 크기를 구분하는 공백이 그대로 유지됩니다. 정규식은 sed
이 패턴 삭제를 구현합니다. #...#...#
구분자 제공(성냥그리고바꾸다), 이 -r
플래그를 사용하면 확장 정규식을 사용할 수 있습니다. 구조적으로 ^
줄의 시작 부분에 일치 항목이 있습니다 . \S+
하나 이상의 공백이 아닌 문자에 대한 일치 항목과 \s+
하나 이상의 공백 문자에 대한 일치 항목이 있습니다. 대괄호는 (...)
두 항목을 함께 그룹화하고 중괄호는 {3}
그룹이 다음과 같아야 함을 나타냅니다. 3번 반복.
4.0K Jun 6 2014 template
4.0K May 21 17:35 stuff
0 Mar 16 09:46 Items
1.4K Mar 23 18:07 something.sh
24K May 19 14:45 curtain
답변3
합창단에 합류한 후 이를 사용하여 awk
원하지 않는 열을 지울 수도 있습니다.
[jis@localhost ~]$ ls -lh | awk '{$1=$2=$3=$4="";print}'
4.0K Aug 19 2014 Desktop
4.0K Jan 8 22:39 dir1
4.0K Feb 5 20:41 Documents
12K May 22 19:31 Downloads
4.0K Aug 19 2014 Music
4.0K May 3 20:00 Pictures
4.0K Aug 19 2014 Public
115K May 9 09:05 something.bin
4.0K Aug 19 2014 Templates
1 Dec 12 07:01 testLink -> .
4.0K Aug 19 2014 Videos
[jis@localhost ~]$
답변4
grep을 사용한 깔끔한 솔루션:
ls -lhn | grep -oP "^([[:graph:]]+\s){4}\K.+"
여기,
[[:graph:]] ==> all printed characters (i.e. no spaces, newlines)
\s ==> space
{4} ==> exactly four matches