[bash script] line from file

Pagina: 1
Acties:

  • M-ThijZ
  • Registratie: Maart 2003
  • Laatst online: 22:22

M-ThijZ

Riding on Rails

Topicstarter
Dag beste Tweakers. Voor een script dat in een crontab staat moet steeds een specifieke lijn uit een bestand in een variabele worden gezet. Hoe kan ik dat het beste doen? Ik heb al veel gelezen over programma's zoals cat / grep / awk / cut, maar ik kom er niet uit.
Ik heb gewoon een bestand met wat regels en het programma moet eerst regel 1 dan 2 dan 3 etc. uitlezen.

  • elevator
  • Registratie: December 2001
  • Niet online

elevator

Officieel moto fan :)

Bash:
1
2
3
4
while read input 
do
  echo $input
done < file.txt

  • M-ThijZ
  • Registratie: Maart 2003
  • Laatst online: 22:22

M-ThijZ

Riding on Rails

Topicstarter
Het is de bedoeling dat ik alleen bijv. de 2e regel eruit haal. anders zou ik `cat filename` ook in een for loop kunnen gebruiken.

  • M-ThijZ
  • Registratie: Maart 2003
  • Laatst online: 22:22

M-ThijZ

Riding on Rails

Topicstarter
$line = 1
$var = (iets wat regel $line uit een bestand krijgt)
$line = $line + 1

dit wordt een dag later weer uitgevoerd waardoor dus regel2 uit het bestand gehaald word.
zeker niet bash-correct ;-)

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

maak gewoon creatief gebruik van head en tail :)

om de tweede regel uit een bestand te halen doe je een head -2 en vervolgens een tail -1 :)

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


  • Wilke
  • Registratie: December 2000
  • Laatst online: 23:18
Dus je wilt alleen regelnummer $gewensteregel uit het bestand halen?

De min-of-meer voor de hand liggende manier:

Pak alleen de eerste zoveel regels uit de file waar precies nog de regel bij zit die je wilt hebben; houd daarna alleen de laatste over.
code:
1
head -n $gewensteregelnummer bestand.txt | tail -n 1



Iets slimmer, maar ws. nog steeds niet uitblinkend in snelheid:

Gebruik sed om regel 1 t/m (gewensteregel-1) te verwijderen (d=delete line), en vervolgens ook
regel (gewensteregel+1) tot en met het eind van de file ($).
code:
1
sed "1,$[gewensteregel-1]d;$[gewensteregel+1]\$d" bestand.txt


Wie weet nog een handiger manier?

  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
Met awk:
code:
1
awk "{if (NR == $gewensteregel) print }" bestand.txt

"He took a duck in the face at two hundred and fifty knots."


  • blaataaps
  • Registratie: Juli 2001
  • Niet online
Je kunt ook "dog", een improvement van "cat" installeren, daarbij kun je gewoon regelnummers opgeven als ik me niet vergis, dog is wel een fijne tool op zich, maar vergeet niet dat scripts die dat gebruiken niet echt portable zijn, omdat dog lang niet overal beschikbaar is.

  • M-ThijZ
  • Registratie: Maart 2003
  • Laatst online: 22:22

M-ThijZ

Riding on Rails

Topicstarter
Ik denk dat ik met deze reacties wel uit de voeten kan. Ik zal head / tail wel gaan gebruiken aangezien deze het makkelijkst te gebruiken / overzichtelijk is. Dit script draait 1x per dag, echt veel met de snelheid hoef ik geen rekening te houden.
Ik begrijp dat je met sed een regel ook daadwerkelijk uit een bestand kunt verwijderen? Dat kan ook nog wel van pas komen.

Bedankt voor jullie reacties!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Niet bijster speciaal (of netjes ;)), maar..

code:
1
perl -e 'while(<>){++$i==3?print:"";}'

Regels op stdin, print de 3e regel.

Of simpeler:
code:
1
2
3
4
perl -ne '$.==3?print:""'

# Correctere versie (i.e., minder evil, die hierboven doet exact hetzelfde):
perl -ne 'print $.==3?$_:""'


Maar die eerste ziet er leuker uit :+

[ Voor 27% gewijzigd door CyBeR op 28-07-2004 23:34 ]

All my posts are provided as-is. They come with NO WARRANTY at all.


  • M-ThijZ
  • Registratie: Maart 2003
  • Laatst online: 22:22

M-ThijZ

Riding on Rails

Topicstarter
maar de variablen in bash werken niet in perl :/ Of miss doe ik dan iets verkeerd. maar de kop/staart oplossing werkt wel voor mij. In perl is het inderdaad een stuk netter.

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Oh, je wilde de linenumber uit een andere var. De enige reden dat bash vars niet werken is dat ik '' gebruik omdat bash en perl beide '$' gebruiken voor variables.

Je kunt 't zo doen:
code:
1
2
LINE=3
perl -ne '$.=='$LINE'?print:""' file.txt


Mensen zullen je vreemd aankijken en mischien zelfs ontzag voor je hebben, afhankelijk van hun eigen code sk1llz ;)

All my posts are provided as-is. They come with NO WARRANTY at all.


  • Wilke
  • Registratie: December 2000
  • Laatst online: 23:18
Acid-Rain schreef op 28 juli 2004 @ 23:27:
Ik begrijp dat je met sed een regel ook daadwerkelijk uit een bestand kunt verwijderen?
Regel deleten kan met "sed '[eenregelnummer]d' eenfile".

Btw. _Squatt_ wint denk ik met de 'awk' oplossing - die is IMHO veruit het netst.

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Wilke schreef op 29 juli 2004 @ 00:32:
[...]


Regel deleten kan met "sed '[eenregelnummer]d' eenfile".

Btw. _Squatt_ wint denk ik met de 'awk' oplossing - die is IMHO veruit het netst.
Die is qua werking identiek aan de mijne. Awk loopt over alle regels heen en print als 't regel nummer $whatever is. 't ziet er alleen netter uit, maar dat komt ook omdat ik m'n best gedaan heb om m'n perl er zo ranzig mogelijk uit te laten zien ;)

All my posts are provided as-is. They come with NO WARRANTY at all.


  • TrailBlazer
  • Registratie: Oktober 2000
  • Laatst online: 07-02 09:48

TrailBlazer

Karnemelk FTW

met nl line numbers ervoor zetten dan greppen op het line number en dan iets met awk klussen

dus
code:
1
nl file | grep [i]regelnummer[/i] | awk iets


let er wel op dat je regelnummer uniek moet zijn dus doet iets met een egrep
^regelnummer\s ofzo

  • Kees
  • Registratie: Juni 1999
  • Laatst online: 18-02 12:35

Kees

Serveradmin / BOFH / DoC
code:
1
2
3
line=5
file=blaat
grep -n . ${file} | grep "^${line}:" | cut -d":" -f2-

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
Om te stoppen met lezen nadat je de bewuste regel hebt geprint (wat eigenlijk wel zo netjes is):
code:
1
awk "{if (NR == $gewensteregel) {print; exit} }" bestand.txt

"He took a duck in the face at two hundred and fifty knots."

Pagina: 1