Yanıtlar:
sed Çözüm:
sed -e 1b -e '$!d' file
Eğer stdin
böyle bir şey olursa okur (örneğin 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
baş ve kuyruk Çözüm:
(head -n1 && tail -n1) <file
Bir komuttan veri geldiğinde ( 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 Çözümü:
awk 'NR==1; END{print}' file
Ve ayrıca borulu örnek 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)
son sembol olarak çok büyük bir komuta ve pipom var. Çok | sed '1p;$!d'
kısa.
head && tail
Gerçekten senin için çalışıyor mu ? sadece seq 10 | (head -n1 && tail -n1)
yazdırır 1
.
-e 1b
- ilk satırda, baştaki "baskının" gerçekleştiği noktadaki betiğin sonuna kadar dallanın . Giriş sadece bir satır uzunluğunda ise sed biter. Aksi takdirde, sonuncusu dışındaki tüm satırlar için silin. Son satırda, örtük "yazdırma" tekrar olur.
sed
4.2.2. Şerefe.
sed -n '1p;$p' file.txt
file.txt 'in ilk ve son satırını yazdıracaktır.
sed -e 1b -e '$!d'
istemiyorsanız tercih edebilirsiniz .
Komik bir saf Bash≥4 yolu:
cb() { (($1-1>0)) && unset "ary[$1-1]"; }
mapfile -t -C cb -c 1 ary < file
Bundan sonra , ilk satırı ary
(yani, dizini içeren 0
) ilk satırı file
ve son alanı da son satırı içeren bir dizi elde edersiniz file
. Geri arama cb
(dizideki tüm çizgileri sıkıştırmak istiyorsanız isteğe bağlı), tüm ara çizgileri belleğin dağılmaması için ayarlar. Ücretsiz bir yan ürün olarak, dosyadaki satır sayısına da sahip olacaksınız (dizinin son dizini olarak + 1).
Demo:
$ 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='()'
Eğer st değil ve la değil ise hatları ile elete sed
olabilir .
Kullanım için (olumsuzladığı) bir durum ve birleştirmek için yapı VE koşullar:d
1
$
!
NOT
X{Y..}
X
Y
cmd | sed '1!{$!d;}'
ya da - 2
nd'den la - ye kadar olan bir aralığı kullanabilir $
ve o satırdaki tüm satırları silebilirsiniz $
:
cmd | sed '2,${$!d;}'
Perl kullanımı:
$ seq 10 | perl -ne 'print if 1..1 or eof'
1
10
Yukarıda çıkışında ilk öğeyi yazdırır seq 10
aracılığıyla if 1..1
iken, or eof
irade de son öğeyi yazdırmak.
/etc
abrt
ve yum.repos.d
bu soruyu yapmak zorunda?
Kedi olmadan:
$ cat file |tee >(head -n1) >(tail -n1) >/dev/null
1
5
veya
$ (head -n1 file;tail -n1 file)
1
5
$ seq 100 | { IFS= read -r first; echo "$first"; tail -1; }
1
100
wc -l
bir dosyanın son satırının çıktısıyla ilgisi yoktur.