2009-05-22 4 views
3

J'ai cet ensemble de commandes passepoilées:Comment acheminer un résultat de commande vers une option - <character><argument>? (Sans espaces)

grep -n '*' file.txt | head -n1 | awk -F\: '{print $1-1;}' 

Il me dit la ligne précédente à celle où il faut d'abord trouver des astérisques. Maintenant, je veux obtenir les lignes précédentes tuyauterie à:

head -n<that previous line number> 

Head a besoin d'un numéro suivant immédiatement l'argument -n, sans espaces, par exemple:

head -n4 

Comment puis-je faire cela? Il n'acceptera simplement pas d'ajouter

| head -n 

à la fin de l'ensemble des commandes. Mes recherches ont été infructueuses. Merci!

Répondre

4

Vous voulez en arrière-tiques pour remplacer la valeur:

head -n`grep -n '*' file.txt | head -n1 | awk -F\: '{print $1-1;}'` file.txt 

Ou peut-être quelque chose de similaire sur plusieurs lignes:

LINENO=`grep -n '*' file.txt | head -n1 | awk -F\: '{print $1-1;}'` 
head -n${LINENO} file.txt 
+0

Excellent! Merci beaucoup pour votre réponse rapide !! – David

+0

Je suggère d'utiliser $() au lieu de backticks; $() niche et est plus facile à distinguer que les trois types de guillemets simples que vous pouvez trouver sur votre clavier. –

1

Je pense que vous pouvez également utiliser xargs. Quelque chose comme:

grep -n '*' file.txt | head -n1 | awk -F\: '{print $1-1;}' | xargs -I % head -n% file.txt 
2

Pourquoi ne pas vous venez:

awk -- '{if (!/*/) print $0; else exit}' file.txt 

ou ce qui est plus rapide:

awk -- '/*/ {exit}; {print}' file.txt 
+0

C'est une excellente idée, je vais mieux l'utiliser, merci! Toutefois, par souci de cohérence avec la question posée, je continuerai à accepter la première réponse de Douglas et Aaron comme les réponses valides. (La réponse de Joe fonctionne également). Malheureusement, je ne peux toujours pas évaluer les réponses! – David

Questions connexes