Answers:
sed解决方案:
sed -e 1b -e '$!d' file
从stdin
if 读取时将如下所示(例如ps -ef
):
ps -ef | sed -e 1b -e '$!d'
UID PID PPID C STIME TTY TIME CMD
root 1931 1837 0 20:05 pts/0 00:00:00 sed -e 1b -e $!d
头尾解决方案:
(head -n1 && tail -n1) <file
当数据来自命令(ps -ef
)时:
ps -ef 2>&1 | (head -n1 && tail -n1)
UID PID PPID C STIME TTY TIME CMD
root 2068 1837 0 20:13 pts/0 00:00:00 -bash
awk解决方案:
awk 'NR==1; END{print}' file
还有管道的示例ps -ef
:
ps -ef | awk 'NR==1; END{print}'
UID PID PPID C STIME TTY TIME CMD
root 1935 1837 0 20:07 pts/0 00:00:00 awk NR==1; END{print}
(head -n1 file;tail -n1 file)
很大的命令和管道作为最后一个符号。这么| sed '1p;$!d'
短。
head && tail
你真的有用吗?仅seq 10 | (head -n1 && tail -n1)
打印1
。
-e 1b
在第一行上,分支到sed脚本的末尾,这时将发生隐式“打印”。如果输入只有一行,则sed结束。否则,对于除最后一行以外的所有行,请删除。在最后一行,隐式的“打印”再次发生。
sed
4.2.2上。干杯。
sed -n '1p;$p' file.txt
将打印file.txt的第一行和最后一行。
sed -e 1b -e '$!d'
如果您不希望这样做,则可能会更喜欢。
一个有趣的纯Bash≥4方式:
cb() { (($1-1>0)) && unset "ary[$1-1]"; }
mapfile -t -C cb -c 1 ary < file
之后,您将得到一个数组,ary
其中第一个字段(即index 0
)为的第一行file
,而其最后一个字段为的最后一行file
。回调cb
(如果要对数组中的所有行都加注,则为可选)会取消所有中间行的设置,以免使内存混乱。作为免费的副产品,您还将在文件中拥有行数(作为array + 1的最后一个索引)。
演示:
$ mapfile -t -C cb -c 1 ary < <(printf '%s\n' {a..z})
$ declare -p ary
declare -a ary='([0]="a" [25]="z")'
$ # With only one line
$ mapfile -t -C cb -c 1 ary < <(printf '%s\n' "only one line")
$ declare -p ary
declare -a ary='([0]="only one line")'
$ # With an empty file
$ mapfile -t -C cb -c 1 ary < <(:)
declare -a ary='()'
有了sed
你可以d
elete行,如果不将1
ST一个AND NOT洛杉矶$
t的一。
使用!
到NOT
(否定)的条件和X{Y..}
结构结合X
及 Y
条件:
cmd | sed '1!{$!d;}'
或者您可以使用范围-从2
nd到lat- $
并删除该范围内除lat $
行之外的所有行:
cmd | sed '2,${$!d;}'
使用Perl:
$ seq 10 | perl -ne 'print if 1..1 or eof'
1
10
上述在打印的输出中的第一项seq 10
通过if 1..1
,同时or eof
也将打印的最后一个项目。
/etc
abrt
和yum.repos.d
必须做的这个问题?
没有猫:
$ cat file |tee >(head -n1) >(tail -n1) >/dev/null
1
5
要么
$ (head -n1 file;tail -n1 file)
1
5
wc -l
与输出文件的最后一行无关。