获取一行的前 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))

相关内容