我有文本文件。任务 - 从文件中获取第一行和最后一行
$ cat file | grep -E "1|2|3|4" | commandtoprint
$ cat file
1
2
3
4
5
需要这个没有 cat 输出(只有 1 和 5)。
~$ cat file | tee >(head -n 1) >(wc -l)
1
2
3
4
5
5
1
也许存在 awk 和更短的解决方案......
答案1
sed解决方案:
sed -e 1b -e '$!d' file
从 if 读取时stdin
看起来像这样(例如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}
答案2
sed -n '1p;$p' file.txt
将打印 file.txt 的第一行和最后一行。
答案3
一个有趣的纯 Bash≥4 方式:
cb() { (($1-1>0)) && unset "ary[$1-1]"; }
mapfile -t -C cb -c 1 ary < file
之后,您将得到一个数组ary
,其中第一个字段(即索引0
)是 的第一行file
,最后一个字段是 的最后一行file
。回调cb
(如果您想读取数组中的所有行,则可选)取消设置所有中间行,以免混乱内存。作为免费的副产品,您还将获得文件中的行数(作为数组的最后一个索引+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='()'
答案4
没有猫:
$ cat file |tee >(head -n1) >(tail -n1) >/dev/null
1
5
或者
$ (head -n1 file;tail -n1 file)
1
5