줄의 처음 5자와 마지막 10자를 가져오는 명령

줄의 처음 5자와 마지막 10자를 가져오는 명령

다음 줄이 있습니다.

postgres  3625     1  0 Jan31 ?        00:00:35 /opt/rh/rh-postgresql95/root/usr/bin/postgres -D /var/opt/rh/rh-postgresql95/lib/pgsql/data

처음 5자와 마지막 10자를 잘라내어 한줄로 연결하라는 명령을 내려주세요.

답변1

여기서 무엇을 하고 싶은지 잘 모르겠지만,

foo="postgres 3625 1 0 Jan31 ? 00:00:35 /opt/rh/rh-postgresql95/root/usr/bin/postgres -D /var/opt/rh/rh-postgresql95/lib/pgsql/data"

표준 bash기능을 사용하여 실행할 수 있습니다.

$ echo ${foo:0:5}
postg
$ echo ${foo: -10:10}
pgsql/data
$ echo ${foo:0:5} ${foo: -10:10}
postg pgsql/data
$ echo ${foo:0:5}${foo: -10:10}
postgpgsql/data

두 번째 문의 음수 오프셋은 "끝부터 시작"을 의미합니다.

답변2

사용 sed:

sed -E 's/(.{5}).*(.{10})$/\1\2/' infile

또는 cutand를 사용하세요 wc(입력으로 한 줄만 있거나 모든 줄의 길이가 같은 경우).

cut -c1-5,$(($(wc -c <infile)-10))- <infile

답변3

명령줄 메서드 컬렉션을 풍부하게 하기 위해 다음을 수행합니다.

s="postgres  3625     1  0 Jan31 ?        00:00:35 /opt/rh/rh-postgresql95/root/usr/bin/postgres -D /var/opt/rh/rh-postgresql95/lib/pgsql/data"

grep방법:

echo $(printf "%s" $(grep -Eo '^.{5}|.{10}$' <<<"$s"))
postgpgsql/data

awk방법:

awk '{ print substr($0,1,5) substr($0, length-9) }' <<<"$s"
postgpgsql/data

답변4

colrm과 wc의 또 다른 방법

start=5
end=10
s='postgres  3625     1  0 Jan31 ?        00:00:35 /opt/rh/rh-postgresql95/root/usr/bin/postgres -D /var/opt/rh/rh-postgresql95/lib/pgsql/data'
# with dash
printf "%s\n" "$s" | colrm $start $(($(printf "%s\n" "$s" | wc -c)-$end))
# with bash
# <<<$s colrm $start $(($(wc -c <<<$s)-$end))

관련 정보